每天一个白话算法系列第三回:插入排序

Posted 竹森技术分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个白话算法系列第三回:插入排序相关的知识,希望对你有一定的参考价值。

        Today是第三回,昨天聊了选择排序,今天我们说说插入排序。

        设一维数组ARR中一共有N个无序元素ARR[0]~ARR[N-1],欲要从左到右,实现升序排列。

        从1到N-1,进行N-1轮循环。

        我们先设定个变量h,ARR[m]和ARR[n]是ARR[0]~ARR[N-1]中的任意两个,且m<n。我们令ARR[n] = ARR[m],则我们就说h = m;

        在第1轮循环开始的时候,本轮我们从ARR[1]开始,ARR[1]的初始值为S,那么它的前1位是ARR[0]。

            step1 如果ARR[0]位置上的数值S0比S大,那么就让ARR[1] = S0,此时h=0,反之则不动,此时h=1。

        在第1轮循环结束之前,我们就让ARR[h] = S。(意义:要么ARR[1]和ARR[0]换值,要么不换)

        如此,第一轮结束的时候,能保证ARR[0]<ARR[1]。

        在第2轮循环开始的时候,本轮我们从ARR[2]开始,ARR[2]的初始值为T,ARR[2]的前1位是ARR[1]。

            step1 如果ARR[1]位置上的数值T1比T大,那么就让ARR[2] = T1,此时,h=1,并且进入step2;反之则不动,此时h=2;

            step2 如果ARR[0]位置上的数值T0比T大,那么就让ARR[1] = T0;此时,h=0;反之则不动,此时h=1;

        在第2轮循环结束之前,我们就让ARR[h] = T。

        如此,第二轮结束的时候,能保证ARR[0]<ARR[1]<ARR[2]。

......

......

        在第N-1轮循环开始的时候,本轮我们从ARR[N-1]开始,ARR[N-1]的初始值为U,ARR[N-1]的前1位是ARR[N-2]。

            step1 如果ARR[N-2]位置上的数值U(N-2)比U大,那么就让ARR[N-1] = U(N-2),此时,h=N-2,并且进入step2;反之则不动,此时h=N-1;

            step2 如果ARR[N-3]位置上的数值U(N-3)比U大,那么就让ARR[N-2] = U(N-3),此时,h=N-3,并且进入step3;反之则不动,此时h=N-2;

            ......

            ......

            step3 如果ARR[0]位置上的数值U0比U大,那么就让ARR[1] = U0;此时,h=0;反之则不动,此时h=1;

        在第N-1轮循环结束之前,我们就让ARR[h] = U。

        如此,第N-1轮结束的时候,能保证ARR[0]<ARR[1]<ARR[2]<......<ARR[N-1]。

        至此,数组ARR实现从左到右升序排列。

        这,就是插入排序。

        说白了,插入排序其实就是,从左到右,依次遍历一列数据,将每个元素依次与它左边的元素们相比较,直到遇到一个小于或者等于这个元素的位置前停下来,并插入进去。这样,在遍历的过程中,将每个元素都向左插入到一个合适的位置,遍历结束之后,整列数据就有序了。

        接下来,我们讨论一下选择排序的时间复杂度:

        O(N) = 1+2+3+....+(n-1) =  (N²-N)/2

        可知:插入排序的时间复杂度为O(n²)

        同样,插入排序是稳定的。


        OK,第三回到此结束,朋友们,我们明天再见~~

以上是关于每天一个白话算法系列第三回:插入排序的主要内容,如果未能解决你的问题,请参考以下文章

白话经典算法系列之三 希尔排序的实现

白话计算机排序算法之插入排序,带动画演示

每天学算法:插入排序

直接插入排序与缩小增量插入排序(希尔排序ShellSort)

第三篇,插入排序算法:直接插入排序希尔排序

排序算法系列:插入排序算法