ACM教程 - 希尔排序

简介: ACM教程 - 希尔排序

定义

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

  • 稳定性:根据 相等元素 在数组中的 相对顺序 是否被改变,排序算法可分为「稳定排序」和「非稳定排序」两类。
  • 就地性:根据排序过程中 是否使用额外内存(辅助数组),排序算法可分为「原地排序」和「异地排序」两类。一般地,由于不使用外部内存,原地排序相比非原地排序的执行效率更高。
  • 自适应性:根据算法 时间复杂度 是否 受待排序数组的元素分布影响 ,排序算法可分为「自适应排序」和「非自适应排序」两类。「自适应排序」的时间复杂度受元素分布影响,反之不受其影响。
  • 比较类:比较类排序基于元素之间的 比较算子(小于、相等、大于)来决定元素的相对顺序;相对的,非比较排序则不基于比较算子实现。

图解

在此我们选择增量 gap=length/2,缩小增量以 gap = gap/2 的方式,用序列 {n/2,(n/2)/2...1} 来表示。

  • 初始增量第一趟 gap = length/2 = 4

image.png

  • 第二趟,增量缩小为 2

image.png

  • 第三趟,增量缩小为 1,得到最终排序结果

image.png

性质

  • 时间复杂度
  • 最佳 O()
  • 平均 O(nlogn)
  • 最差 O()
  • 空间复杂度
  • 最差 O(1)
  • 稳定性:不稳定
  • 就地性:原地
  • 自适应性:自适应
  • 比较类:比较

Java

publicclassShellSort {
// 内层循环其实就是插入排序publicstaticvoidsort(Comparable[] arr) {
intj;
for (intgap=arr.length/2; gap>0; gap/=2) {
for (inti=gap; i<arr.length; i++) {
Comparabletmp=arr[i];
for (j=i; j>=gap&&tmp.compareTo(arr[j-gap]) <0; j-=gap) {
arr[j] =arr[j-gap];
                }
arr[j] =tmp;
            }
        }
    }
publicstaticvoidmain(String[] args) {
intN=2000;
Integer[] arr=SortTestHelper.generateRandomArray(N, 0, 10);
ShellSort.sort(arr);
System.out.println(Arrays.toString(arr));
    }
}
目录
相关文章
|
人工智能 算法
ACM算法训练【双指针算法合集】
思路: 找到i,j的单调性,统一向后移动,使时间复杂度为O(2n) 枚举i,每次看j是否需要向后走,得到最长的长度
93 1
ACM算法训练【双指针算法合集】
|
算法 C++
ACM算法训练【快速排序】
ACM算法训练【快速排序】
57 0
ACM算法训练【快速排序】
|
算法
ACM算法训练【归并排序】
ACM算法训练【归并排序】
67 0
ACM算法训练【归并排序】
|
算法
ACM算法训练【贪心合集】
ACM算法训练【贪心合集】
129 0
ACM算法训练【贪心合集】
|
搜索推荐 算法 Java
ACM教程 - 堆排序
ACM教程 - 堆排序
207 0
ACM教程 - 堆排序
|
搜索推荐 算法 Java
ACM教程 - 插入排序
ACM教程 - 插入排序
140 0
ACM教程 - 插入排序
|
搜索推荐 算法 Java
ACM教程 - 选择排序
ACM教程 - 选择排序
139 0
ACM教程 - 选择排序
|
搜索推荐 算法 Java
ACM教程 - 冒泡排序
ACM教程 - 冒泡排序
166 0
ACM教程 - 冒泡排序
ACM模板——排序 - 归并排序
ACM模板——排序 - 归并排序
113 0
ACM模板——排序 - 归并排序
|
算法 Python
ACM 选手带你玩转二分查找
ACM 选手带你玩转二分查找
ACM 选手带你玩转二分查找