思想:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,直到全部插入完成。
伪代码:
INSERTION-SORT(A):
1 for j = 2 to A.length 2 key = A[j] 3 //Insert A[j] into the sorted sequence A[1..j - 1] 4 i = j - 1 5 while i > 0 and A[i] > key 6 A[i + 1] = A[i] 7 i = i - 1 8 A[i + 1] = key
这里假设数组下标从1开始
代码:
void InsertionSort(int a[], const int length){ int key; for (int i = 1; i < length; ++i){ key = a[i]; int j = i - 1; while (j >= 0 && a[j] > key){ a[j + 1] = a[j]; --j; } a[j + 1] = key; } }
插入排序时间复杂度:
- 最好情况:O(n)
- 最坏情况:O(n2)
- 平均情况:O(n2)
空间复杂度:O(1)
稳定性: 稳定