插入排序-算法导论笔记
插入排序对于少量的数据它是一个有效的算法。插入排序的工作方式像人手里的扑克牌一样。开始时我们手里为空并且桌子上的牌面向下。然后我们每次从桌上拿走一张牌并将它插入手里正确的位置。为了把这种牌插入正确的位置,我们要从右到左将它和已在手中的牌进行比较。如下图:
伪代码:
INSERTION-SORT(A) {
for j = 2 to A.length {
key = A[j];
//Insert A[j] into the sorted sequence A[1...j-1]
i = j - 1;
while i > 0 and A[i] > key {
A[i+1] = A[i];
i = i - 1;
}
A[i+1] = key;
}
}
我们声明一个数组 a = {5,2,4,6,1,3},下标j指正拿到的牌”当前牌”。在for循环的每次迭代的开始,包含元素a[1…j-1]的子数组构成当前已排序好的牌,剩余子数组a[j+1…n]对应于仍在桌上的牌堆。事实上,元素a[1…j-1]就是在原来的位置1到j-1的元素;再把过程用图表示一下。
c语言代码实现:
InsertSort.c
#include <stdio.h>
void insertSort(int *a);
int main() {
int a[6] = { 5,2,4,6,1,3 };
insertSort(a);
int k;
for (k = 0; k < 6;k++) {
printf("%d ", a[k]);
}
getchar();
return 0;
}
void insertSort(int *a) {
int i, j,key;
//这里是从第二个元素开始的
for (j = 1; j < 6; j++) {
key = a[j];
//上一个元素
i = j - 1;
//数组下标0开始所以>=0
while (i >= 0 && a[i] > key){
a[i + 1] = a[i];
i = i - 1;
}
a[i + 1] = key;
}
}
- 需要注意的是和伪代码有点不一样,伪代码只是实现思想for (j = 1; j < 6; j++)这里是从数组第二个元素开始的,数组从0开始,所以是j = 1;while (i >= 0 && a[i] > key)这里也是因为数组是0开始的,所以是>=0。