排序—希尔排序(Java)

算法描述:

① 定义一个增量序列Dm > Dm-1 > ...>D1 = 1;

② 对序列进行m趟排序,对每个Dk进行 “Dk-间隔” 排序;

package com.lin;

public class ShellSort {
    public static void main(String[] args) {

        System.out.println("=====希尔排序=====");
        int[] array = new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
        System.out.println("排序之前:");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }

        //直接插入排序
        array = shellSort1(array);

        System.out.println("\n");
        System.out.println("排序之后:");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    /*
     * 原始的希尔排序:
     * 最大间隔为数组长度的一半
     * 剩余的间隔增量为原来的一半,gap / 2
     */
    public static int[] shellSort(int[] arr) {
        int gap = arr.length / 2;
        while(gap > 0){
            for (int i = gap; i < arr.length; i++) {
                int temp = arr[i];
                int j = i - gap;
                while(j >= 0 && arr[j] > temp){
                    arr[j + gap] = arr[j];
                    j -= gap;
                }
                arr[j + gap] = temp;
            }
            gap /= 2;
        }
        return arr;
    }

    /*
     *  优化的希尔排序:
     *  增量初始值为1,通过3 * gap + 1循环计算,一直得到gap刚好不大于数组长度的三分之一。
     *  此时就取gap做最大间隔,然后通过gap / 3 计算剩下的增量
     *  while(gap < arr.length / 3){
     *      gap = gap * 3 + 1;
     *  }
     *
     * */
    public static int[] shellSort1(int[] arr) {
        int gap = 1;
        while(gap < arr.length / 3){
            gap = gap * 3 + 1;
        }
        while(gap > 0){
            for (int i = gap; i < arr.length; i++) {
                int temp = arr[i];
                int j = i - gap;
                while(j >= 0 && arr[j] > temp){
                    arr[j + gap] = arr[j];
                    j -= gap;
                }
                arr[j + gap] = temp;
            }
            gap /= 3;
        }
        return arr;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容