浅析各类排序算法(五) 插入类排序之希尔排序
2017-11-26 17:41
429 查看
希尔排序(Shell Sort)
希尔排序(Shell Sort)是一种较诡异的排序算法,是一种插入排序的泛化,也称缩小增量排序。我们都知道直接插入排序在序列元素基本有序的情况下效率是很高的。基于此,希尔排序通过一个递减的间隙序列不断使原序列变得更加基本有序,从而降低了算法的时间复杂度。希尔排序的一般步骤:
1.选取一个递减,最后元素为1的间隙序列。2.循环间隙序列的每一个元素k,找出原序列对于k位置的剩余类[k, k + n, k + 2n.....];
3.对剩余类位置组成的元素序列进行直接插入排序。
4.循环k,直到k = 1结束。
排序过程图:
间隙序列的选取:
决定使用哪一种间隙序列的问题是困难的。现在实际应用中普遍使用的间隙序列为Tokuda的序列。即由简单公式定义 {\displaystyle h_ {k} = \ lceil h'_ {k} \ rceil}
, {\
displaystyle h'_ {k} = 2.25h'_ {k-1} +1}
, {\
displaystyle h'_ {1} = 1}
。
时间复杂度:
取决于间隙序列的选取.平均复杂度大于在O(n^1.4)左右。中规模数据表现较好,对于大规模数据还是推荐快排。空间复杂度:
O(1)稳定性:
局部插入过程是稳定的,但整体是不稳定的。代码:
//根据当前间隙序列中的元素dk排序 void ShellInsert(int arr[], int n, int dk) { for(int i = dk + 1; i <= n; i++) { if(arr[i] < arr[i - dk]) { arr[0] = arr[i]; int j; for(j = i - dk; j > 0 && arr[0] < arr[j]; j -= dk) arr[j + dk] = arr[j]; arr[j + dk] = arr[0]; } } } //希尔排序 void ShellSort(int arr[], int dk[], int numdk, int n) { for(int i = 0; i < numdk; i++) ShellInsert(arr, n, dk[i]); }
相关文章推荐
- 浅析各类排序算法(四) 插入类排序之直接插入排序及折半插入,2-路插入算法
- 常见的五类排序算法图解和实现(插入类:直接插入排序,折半插入排序,希尔排序)
- 浅析各类排序算法(三) 交换类排序之快速排序
- 排序算法——插入排序(直接插入排序、折半插入 4000 排序、希尔排序)
- 浅析各类排序算法(七) 选择类排序之堆排序
- 排序算法---直接插入排序和希尔排序
- 排序算法之直接插入排序与希尔排序
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- 排序算法(一):插入排序(直接插入排序、希尔排序)
- 排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)
- 浅析各类排序算法(二) 交换类排序之冒泡排序及鸡尾酒排序
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 各种排序算法汇总(插入排序:直接插入排序、折半插入排序、希尔排序)
- 排序算法(堆排序,直接插入排序,折半插入排序,希尔排序)
- 【Java常用排序算法】插入排序(直接插入排序、希尔排序)
- 排序算法(三)从直接插入排序到希尔排序
- 排序算法--插入排序之希尔排序
- 浅析各类排序算法(六) 选择类排序之简单选择排序
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 排序算法总结(一)---- 直接插入排序,希尔排序(java实现)