算法-排序之希尔排序
2017-07-27 11:40
239 查看
算法-排序之希尔排序
希尔排序得名于其设计者设计者希尔(DonaldShell),设计体现了计算机领域的“分治法”思想。在众多排序算法中,目前而言,希尔排序是唯一能在效率上与快速排序(【算法-排序之二】快速排序)一较高低的算法,目前只有这两种排序算法的时间复杂度突破O(n2)。值得一提的是,希尔排序与快速排序都基于“分治法”,从这里或许可以解释这两种排序算法在效率上的得天独厚。
1. 希尔排序ShellSort()
核心:先将序列分成较多个子序列分别进行排序,再分成较少个子序列分别进行排序,直到最后为一个序列排序。
形象的说:比如先分成 8 个子序分别排序,再 4 个子序,再 2 个子序,最后 1 个(1个也就是全部序列啦)。
希尔排序的实现方法:
1.1如何划分子序列:希尔排序采用每隔固定距离选取一个数的方法划分子序。其中间隔距离称为增量。如图:
通过图示,增量的概念很容易理解吧,增量就是隔多少距离的数都为同一个子序。通过这种方法,如果增量选择为N,那么可以分为N个子序,想想是不是这样哦。每次子序都排好后,增量减半,增量减少意味着子序数减少,直到增量为1,便是全部的数序了,希尔排序完成。
1.2子序内部怎么排序:
讲述1的过程中,说道划分子序后对子序分别排序,那么采取什么排序方法?希尔排序的子序排序方法为插入排序(【算法-排序之三】插入排序)。
算法实现:
希尔排序的代码并不复杂,通过增量是否为1控制整个排序的结束。在增量为为d时,遍历此时的d个子序,从k=0到k=d-1。随后对每个子序进行插入排序操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void ShellSort(int Array[],int n){ int d=n/2; //设置起始增量 while(d >= 1) { //增量为1时排序结束 for(int k=0;k<d;k++) { //遍历所有的子序 for(int i=k+d;i<n;i+=d) { //对每个子序进行插入排序 int temp=Array[i]; //插入排序算法参见链接 int j=i-d; while(j>=k && Array[j]>temp) { Array[j+d]=Array[j]; j=j-d; } Array[j+d]=temp; } } d=d/2; //缩小增量 }} |
来自CODE的代码片
ShellSort.c
2.算法复杂度:
希尔排序的算法复杂度分析可类比快速排序(【算法-排序之二】快速排序)复杂度分析,一般认为希尔排序时间复杂度为:O(nlogn)。
3.空间复杂度:
希尔排序的空间复杂度显然为O(1),仅仅需要一个交换变量。相比快速排序递归调用产生的巨大栈消耗,希尔排序O(1)的空间消耗显得十分让人惊喜。
相关文章推荐
- 面试---算法排序(3)(希尔排序)
- 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 算法(二)初等排序前篇[插入和希尔排序]
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序
- 插入排序的改进算法-希尔排序
- 【Python排序搜索基本算法】之希尔排序
- 【算法-排序之四】希尔排序
- 第十五周项目1 验证算法(2)插入排序之希尔排序
- 【牛客网】直通bat-面试算法精品课_第2章 排序 2.8 希尔排序练习题(JAVA版)
- 排序算法之希尔排序
- 算法——高级排序——快速排序,归并排序,希尔排序
- 算法系列-直接插入排序和希尔排序
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- 简单排序算法实现——希尔排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 算法笔记2-排序-希尔排序(最小增量排序)
- 算法之直接插入排序和希尔排序
- 算法 —— 选择排序,插入排序,希尔排序