数据结构和算法 - 希尔排序
程序员文章站
2022-03-12 15:39:22
...
问题抛出
插入排序存在的问题
数组 arr = {2,3,4,5,6,1},这时需要插入的数 1 ,这样的插入过程是
{2,3,4,5,6,6}
{2,3,4,5,5,6}
{2,3,4,4,5,6}
{2,3,3,4,5,6}
{2,2,3,4,5,6}
{1,2,3,4,5,6}
结论:当需要插入的数是较小的时候,后移次数明显增多,影响效率。
问题解决
希尔排序是希尔在1959年提出的一种排序算法。希尔排序是一种比简单插入排序更高效的插入排序,也称缩小增量排序
基本介绍
希尔排序是把数组按照增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
核心思想
先按增量分组,对每组使用插入算法排序,当增量为1时,算法终止
时间复杂度
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 |
---|---|---|---|---|---|
希尔 | O(n) | O()1<s<2 | 不稳定 | O(1) | s 是所选分组 |
流程演示
代码思路
选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,比较常用,也是希尔建议的增量,称为希尔增量,但这个增量序列不是最优的,类似插入排序,增加增量gap的考虑,把数据按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
代码实现
/**
* 希尔排序
*
* @author tianhuiwen
* @date 2020/7/16 20:54
*/
public class ShellSort {
public static void main(String[] args) {
int[] array = {3, 9, 10, 5, -1, 4, 23, 2};
shellSort(array);
System.out.println(Arrays.toString(array));
}
public static void shellSort(int[] array) {
int gap = array.length / 2;
while (gap > 0) {
for (int i = gap; i < array.length; i++) {
int temp = array[i];
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[i] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
}
}
上一篇: 视觉SLAM开源程序学习(一)——ubuntu系统下安装
下一篇: 一个时间与金钱的良好忠告