基本排序方法之四——希尔排序
2015-08-01 17:08
246 查看
希尔排序(shell sort)又称缩小增量排序(diminishing increment sort),是希尔于1959年对直接插入排序进行改进后提出来的。
希尔排序的基本思想:首先取一个小于n的整数d1作为第一个增量,把全部记录分为d1个组,所有间隔为d1的记录放在同一个组中,在各组内进行直接插入排序(也可采用冒泡排序等其他排序方法),这样一次分钟排序的过程称为一趟排序;然后取第二个增量d2<d1重复上述的分组和排序,直到所取的增量dm=1,即所有记录放在同一组中进行直接插入排序为止。
希尔排序实质上是一种分组插入排序方法,每趟排序过程中,它不是朱各元素进行比较,而是先将整个待排序记录序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
在希尔排序中,增量序列可以有各种取法,但应该遵循使增量序列中的值没有除1之外的公因子,并且最后一个增量的值必须为1的原则。
希尔排序的C语言实现如下:
希尔排序的基本思想:首先取一个小于n的整数d1作为第一个增量,把全部记录分为d1个组,所有间隔为d1的记录放在同一个组中,在各组内进行直接插入排序(也可采用冒泡排序等其他排序方法),这样一次分钟排序的过程称为一趟排序;然后取第二个增量d2<d1重复上述的分组和排序,直到所取的增量dm=1,即所有记录放在同一组中进行直接插入排序为止。
希尔排序实质上是一种分组插入排序方法,每趟排序过程中,它不是朱各元素进行比较,而是先将整个待排序记录序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
在希尔排序中,增量序列可以有各种取法,但应该遵循使增量序列中的值没有除1之外的公因子,并且最后一个增量的值必须为1的原则。
希尔排序的C语言实现如下:
/************************ 希尔排序(缩小增量排序) ************************ 函数名称:void ShellSort(int a[], int len) 参 数:int a[]---待排序的数据 int len---待排序数据的个数,也即数组a的长度 功 能:完成希尔排序(缩小增量排序) 返 回 值:无 说 明:排序好的数据依然存放在数组a中 *************************************************************************/ void ShellSort(int a[], int len) { int i, j, d, temp; // temp为哨兵 d为增量 for(d=len/2; d>=1; d/=2) // 增量值有多少个,就进行多少趟排序 { // 当d=1时,下面的二重for循环就是直接插入排序(简单插入排序) for(i=d; i<len; i++) // 每趟最多进行len-d次排序 { temp = a[i]; // 将每次待排序的元素复制为哨兵 for(j=i-d; j>=0&&a[j]>temp; j-=d) // 从a[i-d]到a[0]逐个与哨兵(a[i])比较,大于哨兵的就后移 a[j+d] = a[j]; // 直到遇到小于或等于哨兵的元素或是遇到a[0] a[j+d] = temp; // 将哨兵(也即待排序的元素)插入到第一个小于或等于哨兵元素之后 } } }
相关文章推荐
- 怎样判断一个P2P平台是否靠谱?
- 事件查看器事件ID部分说明
- 图像检测经典的评估方式——PR曲线,ROC曲线
- String to Integer (atoi)
- 卡特兰数
- CSS基础-18CSS盒子模型-盒子模型应用
- epoll实现分析
- POI-----POI操作Excel-5、公式
- 【Adaptive Boosting】林轩田机器学习技法
- [LeetCode] Group Anagrams
- LTView
- Samba服务器
- 双向循环链表和树
- 剑指Offer(33)求数组排列出来的最小数
- 《Sublime Text 2搭建Java开发环境》
- hdu1299
- codeforces290E
- 讨论Spark的配置监控和性能优化
- Equal Sum Sets
- B - 皇马