2022更文挑战16-希尔排序

124 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

希尔排序

前文

本文为对于希尔排序相关知识的个人理解及总结,不能保证十分准确,难免存在不准确之处,如果出现还请见谅。

希尔排序

希尔排序是常用的一种排序方法之一。它的思想是通过比较相距一定距离的元素,每次的比较距离会呈减小的趋势,直到最后一次的排序只需要比较相邻元素即可。

希尔排序的思想可以理解为一种特殊的插入排序。它主要是通过对于要排序的元素序列进行反复的插入排序操作,首先需要指定一个排序间隔,假设为k。在每一轮排序中,先将间隔为k的元素视为一组数据,将每组数据都进行排序操作。然后将间隔值不停的缩小,一直到间隔值为1。与此同时,每一轮排序中的操作都会将新的一组数据进行排序。这样随着k值的减小,会得到一个趋近于目标排序的过程。一直到k值减小为1时,即可得到最终的排序结果。

public void sort(int[] list){
    int jj;
    for (int k = list.length/2; k > 0 ; k = k/2) {
        for (int i = k; i < list.length; i++) {
            int tmp = list[i];
            jj = i;
            for (int j = i; j >= k && list[i] < list[j - k]; j = j - k) {
                list[j] = list[j - k];
            }
            list[jj] = tmp;
        }
    }

    for (int i = 0; i < list.length; i++) {
        System.out.println(list[i]);
    }
}

如上,是一段简单的希尔排序代码示例。根据代码可知,希尔排序的核心思想相当于反复对于插入排序进行应用,只不过不停的改变组成临时元素的间隔,这与上面所描述的希尔排序的概念一致。

希尔排序的代码并不复杂,但是由于希尔排序的运行时间取决于所选择的间隔k,因此时间的证明会相对比较复杂。因此忽略证明过程的描述,希尔排序的时间复杂度平均为nlog2n。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。