插入排序-演算法導論筆記
阿新 • • 發佈:2019-01-05
插入排序對於少量的資料它是一個有效的演算法。插入排序的工作方式像人手裡的撲克牌一樣。開始時我們手裡為空並且桌子上的牌面向下。然後我們每次從桌上拿走一張牌並將它插入手裡正確的位置。為了把這種牌插入正確的位置,我們要從右到左將它和已在手中的牌進行比較。如下圖:
虛擬碼:
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。