本文是阅读《算法导论》的读后笔记。
1 插入排序
输入:n个数得一个序列<a1, a2, a3, a4, ... , an>
输出:按照值的升序排列输出
插入排序简介:
这是一个对于少量元素很有效的算法。就像玩扑克牌一样,将整个输入序列划分成两个序列,前段有序序列和后段无序序列。前段有序序列初始时只有一个元素。在每一趟排序的中,从后面无序序列中抽出第一个插入到前段有序的序列中。重复知道完成排序。
伪代码实现:
我们将伪代码实现命名为INSERT-SORT,其中的参数是一个n个输入元素组成数组 A[1..n]。元素的个数用 A.length 表示。
INSERT-SORT(A)
for j = 2 to A.length
key = A[j]
i = j - 1
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i - 1
A[i+1] = key
C代码实现:
void insertSort(int a[], int length){
for (int i=1; i<length; i++) {
int key = a[i];
int j = i - 1;
while (a[j] > key && j >= 0) {
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
插入排序效率分析:
时间复杂度:最好的情况是所排序的本身就是有序的,此时只需要比较不需要移动,需要比较 n-1 次。故时间复杂度为 O(n)。
最坏的情况当让是本身是逆序的,此时既需要比较又需要移动。