直接插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
步骤
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
伪代码
INSERTION-SORT(A)
1 for j=2 to length[A]
2 do key=A[j]
3 //InsertA[j] into the sorted sequenceA[1..j-1].
4 i=j-1
5 while i>0 and A[i] >key
6 do A[i+1] =A[i]
7 i=i-1
8 A[i+1] =key
C++语言代码
1 void insertSort(vector<T> &a) 2 { 3 for(int i = 1; i < a.size(); ++ i) 4 { 5 int x = a[i]; 6 int j = i - 1; 7 while(x < a[j] && j >= 0) 8 { 9 a[j + 1] = a[j]; 10 -- j; 11 } 12 a[j + 1] = x; 13 } 14 }
算法复杂度
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
稳定性
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有一个元素,就是第一个元素。比较是从有序序列的末尾开始的,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找知道找到它该插入的位置。如果碰见一个和插入元素相等的元素,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。