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

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

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

区别在于希尔排序通过步长将数组划分为子数组,将子数组通过插入排序.而步长也要不断的递减,直到步长是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 @   顶风少年  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
返回顶部
点击右上角即可分享
微信分享提示