排序算法(6)- 希尔排序(Shell Sort)

学习排序网站:https://www.toptal.com/developers/sorting-algorithms
本文排序方式以从小到大顺序为准

原理

– 直接插入排序的优化算法
– 把数组按照下标的一定增量分组,对每组使用直接插入排序。随着增量逐渐减少,组中的元素越来越多,直到增量为1时,组里包含所有元素,排序完成则算法结算。

注意点

  • 最小增量必须是1。
  • 因为希尔排序每组执行完后,排序离完成都近了一步;又因为直接插入排序越接近排序完成,效率越高。所以希尔排序比直接插入排序优秀(比较和交换的次数较少)。

示例

    @Override
    int[] sort(int[] data) {
        int len = data.length;
        // Hibbard 增量序列 
        int hibbard = 1;
        while(hibbard < len/2) {
            hibbard = hibbard*2+1;
        }
        // 根据增量分组,每个分组进行一次直接插入排序
        for (int i = hibbard; i > 0; i=(i-1)/2) {
            // 插入排序,排序数组是从j开始,相隔i的元素的汇总
            for (int j = i; j < len; j+=i) {
                int temp = data[j];// 等待插入元素
                int k = j - i;
                while(k >= 0 && data[k] > temp) {
                    data[k+i] = data[k];
                    k-=i;
                }
                data[k+i] = temp;
            }
        }
        return data;
    }

你可能感兴趣的:(排序算法)