插入排序(含希尔排序)的C/C++实现
直接插入排序
直接贴核心代码
for(i=1;i<n;i++)//n为数组长度{t=a[i];//取出待比较元素for(j=i-1;j>=0&&a[j]>t;j--)//在此元素比前数大的情况下进入循环{a[j+1]=a[j];//前面的元素后移}a[j+1]=t;//确定位置,将取出的元素插入}
以上就是整个直接插入排序的核心部分,其中t是用来暂存取出的元素。此法时间复杂度O(n^2)。
二分插入排序
其实二分插入排序在已经会了直接插入排序的基础上十分简单,只需要在你取出元素后对其进行二分法判断,直到找到插入位置,下面放核心代码
for(i=1;i<n;i++)//n为数组长度{t=a[i];//取出待比较元素int left=0;//定义左边界int right=i-1;//定义右边界,所以有序区间为[0,i-1]while(left<=right)//在有序区间进行折半查找,找到插入位置{int mid=(right+left)/2;//先取有序区间中间值if(t<a[mid])//如果取出元素小于中间值,右边界缩小,总之就是二分法的原理,读者应该能理解{right =mid-1;}else{left = mid+1;}}//通过这里的循环,已经找到了插入位置for(j=i-1;j>=left;j--)//这一步就是移动元素,腾出插入位置{a[j+1]=a[j];}a[left]=t;//将元素插入}
以上就是二分插入排序的核心代码,其实就是在直接插入的基础上,用了二分法去判断元素的插入位置。此法时间复杂度最好时O(nlog2n),最坏时O(n^2),所以比起直接插入排序是有一定优势的。
希尔排序
当数据量很大,并且有序程度很低时,上面两种方法的时间复杂度很高,这时就可以采用希尔排序,其时间复杂度为O(n^(1.3—2))。
其实希尔排序不难理解,就是先对数据进行的分组排序,让数据变的整体有序,在此基础上,最终进行直接插入排序,下面直接放核心代码部分
for(gap=n/2;gap>0;gap/=2)//n为数组长度,等长(gap)取子序列排序,最终取长度为1,则进行正常的插入排序{for(i=gap;i<n;i+=gap)//对子序列进行插入排序{t=a[i]; //看到没,其实整个代码和直接插入排序差别不大,只是将for(j=i-gap;j>=0&&a[j]>t;j-=gap) //直接插入排序里的1换成了这里的长度(gap),其他地方{ //都一模一样,只有能掌握直接插入排序就能掌握希尔排序a[j+gap]=a[j];}a[j+gap]=t; }}
相信读者应该能够理解到这三种排序的区别与联系了,快去自己实现试试吧!
插入排序(含希尔排序)的C/C++实现相关推荐
- 插入排序,希尔排序,堆排序
本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...
- 直接插入排序、希尔排序
直接插入排序.希尔排序 一.直接插入排序 (1)主要思想 (2)代码实现 (3)性能分析 二.希尔排序 (1)主要思想 (2)代码实现 (3)性能分析 一.直接插入排序 直接插入排序类似于我们平时玩扑 ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 【排序】插入类排序—(折半)插入排序、希尔排序
前言 在数据结构和算法中,排序是非常重要的一环,并且排序也是渗透编程的方方面面. 你或许在写一个sql的order by按照某组进行排序,又或者你在刷一道题时候.常常遇到贪心+自定义排序求解的思路题, ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)...
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- ds排序--希尔排序_图解直接插入排序和希尔排序
前言 这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 . 对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 ...
- 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序
第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)
*排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...
- 数据结构:从插入排序到希尔排序
数据结构:从插入排序到希尔排序 插入排序 算法思路 每次从无序表中取出第一个元素,将其插入到有序表中的适当位置,使有序表的长度不断加长,完成排序过程. n个待排序的元素由一个有序表和一个无序表组成,开 ...
最新文章
- 保护眼睛设置.txt
- 「biáng biáng 面」马上可以打出来了!Unicode发布13.0版本,收录4939个生僻字
- Redis 数据结构之哈希表
- 手游行业洞察:Project Makeover成爆款,中国手游出海如何破局
- java进行md5运算(Java类函数调用)
- elasticsearch索引的初始化操作以及marvel操作(增删改查),批量查询_mget,批量操作_bulk
- 编写HTML代码常见错误以及解决方法?
- 经典排序算法(二十二)--图书馆排序(Library Sort)
- HTML仿网易云音乐首页静态,用 Vue.js 模仿一个简单的网易云音乐
- react获取鼠标位置_JavaScript 获取鼠标点击位置坐标
- Google浏览器插件怎么安装
- 从智能家居的发展看对讲企业的定位
- python自带的pip版本过低 卸载pip重写安装V10
- 学习笔记2-面包板的使用
- 华为的PBC个人绩效评价模板
- ##稻盛和夫的名言##
- 【初级篇】网页引入live2d
- SolidWorks渲染图
- slite 存储图片
- PADS VX.2.7 + OrCAD 16.5 + AutoCAD 2020 使用教程
热门文章
- 【任务脚本】2020双十一活动小结,京东活动依旧始终良心
- 【问题】windows网络问题快速诊断方法或工具。终于调通了MQTT,论坑爹的windows防火墙!...
- 【PC工具】GiliSoft Video Editor目测还可以的视频制作工具,视频裁剪、转换、合并、加水印、加特效...
- 七、linux驱动注册
- 知乎推荐页Ranking构建历程和经验分享
- el-autocomplete 使用相关问题
- 【go网络编程】-RPC编程
- vector基础操作
- Sublime Text 3 MarkdownEditing布局设置
- win7‘上帝模式’