插入排序

如果一个有序的数组,如何进行数据的插入?这个应该很简单,遍历数组然后一个个比较。找到插入位置后,将后面的数据进行后移就可以实现。

那么插入排序的思想也和这玩意一样,只不过区别是它是在本身的数组上进行的拆入。

核心思想就是这张图:

 只需要控制区间可以做到,类似新数组的真空地带。例如一开始的9肯定不用动,那么就是7和9之间的比较,那么数组的前两个就是真空区间.一个比较一个平移的动作就完成了这个一个排序中最关键的东西。与其说是移动元素不如说是元素的比较过程。

public void insertionSort(int[] a){
        if (a.length<=1){
            return;
        }


        for (int i = 0; i < a.length; i++) {
            int num = a[i];
            int j = i-1;
            for (;j>=0;j--){
                if (num<a[j]){
                    a[j+1] = a[j];
                }
            }
            a[j+1] = num;
        }

    }

  核心的代码关键就是加粗的部分,j控制了区间,使用--的方法,因为这个区间内的数肯定是有序的,所以从后往前是最好的。而且也之间避免了前面空间的不足,如果是从前往后,需要放入第一位,那么就会很麻烦,后面的依然要进行移动,虽然使用System.copyxxxx这种方法可以很快,但是思想上会稍微麻烦一点。

插入排序三个特点:是原地排序,也可以写成非原地排序。是一个稳定的算法,时间复杂度是O(n²)

原文地址:https://www.cnblogs.com/SmartCat994/p/14102651.html