插入排序算法解析
基本思想:将一个记录插入到已排好序的序列中,从而得到一个新的有序序列(将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序)
假设给定一个数组arr = {4,8,6,2,7,3,5,1,9}
a.首先比较数组中第一个数(arr[0] = 4)和第二个数(arr[1] = 8),若第一个数大于第二个数,则两个数交换位置,在这里显然不成立,所以不用交换位置。
b.然后再比较第二个数(arr[1] = 8)和第三个数(arr[2] = 6),同样按照上述规则进行,发现8>6,进行两个数的交换,至此“6”的使命并不算完结,它还需要和第一个数比较,并按照上面的“游戏规则”判断是否与第一个数执行交换。
c.同理,第四个数和第三个数进行比较······················一直比较到第一个比他小的数!!!
d.后面的不一一赘述,看图:
-------关于插入排序的时间复杂度:
1)当初始序列为正序时,只需要外循环arr.length-1次,每次进行一次比较,无需移元素。此时比较次数(为n-1)和移动次数(为0)达到最小值。
此时时间复杂度为O(n)
2)当初始序列为反序时,需要外循环n-1次,每次排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移i次,加上 temp=arr[i]与arr[j]=temp的两次移动,每趟移动次数为i+2,此时比较次数和移动次数达到最大值。
比较次数为1+2+3+4+·····+(n-1) = n(n-1)/2
移动次数为(1+2)+(2+2)+(3+2)+······+(n-1+2) = (n-1)(n+4)/2
所以此时时间复杂度为O(n^2)
-------关于插入排序的空间复杂度:
首先相同元素的相对位置不会变,若比较过程中两个元素相同,则插入元素放在相同元素之后,所以插入排序是一种稳定排序。
其次,看图,插入排序明显与问题规模无关,也并没有用到递归思想,所以其空间复杂度为O(1)