不需要额外申请空间,从数组的第二个元素即 a[1]开始,将其设为key
用key依次从后【key的前一个元素】比较,当key比当前值小时候,把当前值到Key原位置之间的元素依次向后移动一个单元。
key>=当前值以后,把key复制给当前值后面的值即可。
*保证了Key值之前的所有元素都是sorted的。
void InsertSort(int a[], int n) { int i, j, key; for (i = 1; i < n; i++) { j = i - 1; key = a[i]; while (j >= 0 && key<a[j]) { a[j + 1] = a[j]; j--; } a[j + 1] = key; } }
空间复杂度O(1);
时间复杂度:
最好:数组为正序排序,只需要执行for循环,因为key>a[j],直接执行a[j+1]=key即可——O(n)
最坏:逆序,for+while=O(n^2)
平均就是O(n^2)【对于随机排序的数组,移动和比较次数更接近最坏情况】
稳定:
key<a[j]保证了稳定性
//0305复习,有点蒙来着
1、忘记设置key
2、寻找j--的时候以及向后移动的时候用了两个循环竟然。。一个就完全可以做到,可以边寻找边移动
因为没写明白所以时间复杂度也没分析对。。
//0314复习。基本语句可以写出来,0305出现的问题2也记得了,可惜1 依然忘记设置key.会被覆盖的呀