其他分享
首页 > 其他分享> > 希尔排序

希尔排序

作者:互联网

import java.util.Random;

public class ShellSort {

    private ShellSort() {}

    public static <E extends Comparable<E>> void Sort(E[] arr) {

        // 每次希尔排序的间隔
        int h = arr.length / 2;

        while (h >= 1) {
            
            // 依次遍历每个元素(从每个子数组的第二个元素开始)
            for (int i = h; i < arr.length; i++) {
                // 记录待插入的元素
                E temp = arr[i];
                int j = 0;
                // 如果待插入元素小于当前索引元素 则将当前索引元素向后移动
                for (j = i - h; j >= 0 && temp.compareTo(arr[j]) < 0 ; j -= h) {
                    arr[j + h] = arr[j];
                }
                // 将待插入元素插入最后移动的元素的位置
                arr[j + h] = temp;
            }
            // 间隔减半
            h /= 2;
        }

    }

    public static void main(String[] args) {
        int n = 100000;
        Random rnd = new Random();
        Integer[] arr = new Integer[n];
        for (int i = 0; i < n; i++) {
            arr[i] = rnd.nextInt(n);
        }

        // 记录排序消耗的时间
        long startTime = System.nanoTime();
        ShellSort.Sort(arr);
        long endTime = System.nanoTime();
        
        // 检查是否排序正确(从小到大排序)  如果不正确则抛出异常
        for (int i = 0; i + 1 < n; i++) {
            if (arr[i] > arr[i + 1])
                throw new IllegalArgumentException("sort failed");
        }

        // 输出排序消耗时间
        double time = (endTime - startTime) / 1000000000.0;
        System.out.println("ShellSort: arr.length = " + n + " time = " + time + "s");
        
    }

}

标签:arr,int,元素,length,希尔,排序,ShellSort
来源: https://blog.csdn.net/woaichikaoya/article/details/116405934