每天一个白话算法系列第三回:插入排序
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,第三回到此结束,朋友们,我们明天再见~~
以上是关于每天一个白话算法系列第三回:插入排序的主要内容,如果未能解决你的问题,请参考以下文章