算法时空第5讲 插入排序

插入排序

Posted by Twany on July 10, 2019

对应《算法导论》第二章

类比扑克牌,假设我们现在手里已经有了几张牌,再拿到新的一张。则需要与已拿到的对比,并插入。

特点:小规模可以,大规模效率太低

这是一个就地算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        int[] arr = {0,5,2,4,6,1,3};    //排序数组

        //key比较,如果小于前一个,则前一个后移,递推。否则不动
        for (int i = 1; i < arr.length; i++) {  //复杂度 o(n)
            int key = arr[i];   //新值
            int j = i-1;        //需要对比的前一个值

            //如果新值小于前值
            while (key < arr[j]){               //复杂度 o(n)
                arr[j+1] = arr[j];//前值后移一位
                arr[j] = key;

                if( (j--) == 0){            //此处实现了 j-- 并判断是否到头
                    break;
                }
            }
        }

代码分析:

后一个数与前面的数一次比较,若小于前面的数,则前面的数后移一位(始终是相邻两位的比较)

已经排好序的部分为循环不变式 复杂度为 o(n^2)(最坏情况),o(n)(最好情况)