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

插入排序

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

原理

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

​ 插入排序也是如此我们使用两个嵌套的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;
    }
}
发布了72 篇原创文章 · 获赞 89 · 访问量 6538

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/104360264