直接插入排序原理很简单
前提:
一个随机序列。
思路:
从第二个元素开始,每个等待插入元素都要和前面的元素比较。
比较的结果分为两种
①若这个元素大于其前一个元素: 则位置保持不变。
②这个元素小于前一个元素: 则继续往前找其前前一个元素。
同时要比较该元素和前前个元素的大小。
同样,如果大于则插入在其前前一个元素的后面。
若小于,则继续往前找。
直到 找到一个比带插入元素小的,然后插入到哪个元素后面。
然后接着对将后一个元素作为待插入元素,和前面的元素进行比较,直到遍历完这个列表。
注意:
- 若这个表本来就是有序递增的,那其实每个元素只需要和他前面的一个元素进行比较就行了,最好的时间复杂度为O(n)。
- 若这个表中元素顺序是逆序,比如我们想要丛小到大,但是这个表的顺序刚好是丛大到小,那就是最坏的情况,时间复杂度为O(n^2)。
//不使用哨兵的代码
void InsertSort(vector<int> A, int n){
int i, j, temp;
for (i = 1; i < n; i++){
if(A[i]<A[i-1]){//若第i个元素小于第i-1个元素
temp = A[i];//先把第i个元素的值保存下来,因为接下来要将前面的元素往后移动一个单位,会覆盖第i个元素
for(j = i - 1; i >= 0 && A[j] > temp; j--)
A[i+1] = A[j];
//如果前面的元素还是比第i个元素大,那就继续往前比j--,
//直到有一个元素小于等于第i个元素(现在已经保存在temp中了)
A[j+1] = temp;//将第i个元素插入相应位置
}
}
}