算法——插入排序及优化(希尔排序)

插入排序

​ 插入排序是排序算法的一种,顾名思义,是一种插入的形态进行排序的算法

原理

​ 插入排序的过程可以形象的比做我们打扑克抓牌时,整理扑克牌的过程,每次我们抽一张新牌时,会以特定的规律,将其插入到已有的牌中,使手中的牌形成一个有序的牌的集合

​ 插入排序也是如此我们使用两个嵌套的for循环从头开始遍历一个序列,外部的for循环顺序向下执行,内部的for循环负责比较其当前遍历的位置元素是否小于(或大于)它前面的所有元素,如果是,就调换其位置,以此类推,最后得到一个有序的序列

Java 代码

public static void insertionSort(int[] nums) {
    int N = nums.length;
    for (int i = 1; i < N; i++) {
        for (int j = i; j > 0 && nums[j] < nums[j - 1]; j--) {
            int item = nums[j - 1];
            nums[j - 1] = nums[j];
            nums[j] = item;
        }
    }
}

思考

​ 从插入排序的定义中我们可以发现,如果一个尽量有序的序列,例如[1, 2, 3, 4, 0],实际上插入排序的效率是接近O(N)的,因为它的内层循环实际上只运行了一次,所以插入排序十分适合对已经尽量有序的序列来进行排序

优化插入排序——希尔排序

​ 为了优化插入排序,我们可以先使数组尽可能多的有序化,或者说局部有序化,希尔排序就诞生了

原理

​ 希尔排序的原理是通过间隔h分组,将原序列分成又干个不相邻的间隔为h的两两一组的序列,对这两个元素进行插入排序,然后缩小间隔h,再两两进行插入排序,在这个过程中,原序列会从无序越来越趋近于有序,当h = 0时,虽然是对整个序列进行插入排序,但此时序列已经相对的更加有序,所以效率会得到提高

Java 代码

public static void shellsort(int[] nums) {
    int N = nums.length;
    int h = 1;
    while (h < N / 3)
        h = h * 3 + 1;
    while (h >= 1) {
        for (int i = h; i < N; i++) {
            for (int j = i; j >= h && nums[j] < nums[j - h]; j -= h) {
                int item = nums[j];
                nums[j] = nums[j - h];
                nums[j - h] = item;
            }
        }
        h = h / 3;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值