数据结构与算法之希尔排序

希尔排序是插入排序的优化版本.插入排序的思路是每次跟前一个比较,需要交换则交换,然后指针向后移动,再次与前面的比较,如果不需要交换则表示前边的前边也不需要交换.

希尔排序则是通过添加一个步长的概念,每次把当前元素与增加步长后的元素比较,如果交换则交换.然后再次增加步长去比较,这个过程与插入排序一样.希尔排序与插入排序的

区别在于希尔排序通过步长将数组划分为子数组,将子数组通过插入排序.而步长也要不断的递减,直到步长是1此时就退化为插入排序.

这个算法最好情况下时间复杂度:O(n)平均情况下时间复杂度:O((nlog(n))^2)

public static void xier(int[] arr) {
        int gap = arr.length;
        while ((gap = gap / 2) > 0) {
            for (int i = gap; i < arr.length; i++) {
                for (int j = i; j >= gap; j -= gap) {
                    if (arr[j] < arr[j - gap]) {
                        int temp = arr[j];
                        arr[j] = arr[j - gap];
                        arr[j - gap] = temp;
                    } else {
                        break;
                    }
                }

            }
        }
    }

以下代码提供一个测试方法.

public static void main(String[] args) {
        Random random = new Random();
        while (true) {
            int length = random.nextInt(100);int[] arr = new int[length];
            int[] arr2 = new int[length];
            for (int x = 0; x < length; x++) {
                int i = random.nextInt(100);
                arr[x] = i;
                arr2[x] = i;
            }
            xier(arr);
            Arrays.sort(arr2);
            boolean equals = Arrays.equals(arr2, arr);
            System.out.println(equals);
            if (!equals) {
                break;
            }
        }
    }

 

posted @ 2022-04-17 21:28  顶风少年  阅读(34)  评论(0编辑  收藏  举报
返回顶部