算法导论--第二章、插入排序
1. 插入排序类似于整理扑克牌(排列好顺序的扑克和待排序的扑克);
2. 插入排序(INSERTION-SORT)参数是一个数组A[1..n]共n个数,输入的各个数字原地排序(sorted in place),分为排好序的和待排序的,每次取一个待排序元素,找到插入的位置,插入已排好序的部分中。元素取完程序结束,复杂度为O(n^2);
3. 伪代码如下:
INSERTION-SORT(A) for j <- 2 to length(A) do key <- A[j] //Insert A[j] into the sorted sequence A[1..j-1], A下标从1开始存储数据,其中下标1~j-1的数据是排好序的 i <- j-1 while i > 0 and A[i] > key //i>0是控制与j之前所有数据比较的次数,A[i]>key控制数字是从小到大排列,当拍好数据的数大于key时,互相颠倒 do A[i + 1] <- A[i] i <- i-1 //换下一个下标数据进行比较 A[i+1] <-key //key比sorted序列的值都大,则key称为下一个sorted序列加入的数值
4. 具体C代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void InsertSort(int A[]){ 5 int i, j; 6 int key; 7 8 for(j = 1; j < 6; j++){ 9 key = A[j]; 10 i = j - 1; 11 12 while(i >= 0 && A[i] > key){ 13 A[i + 1] = A[i]; 14 i--; 15 } 16 17 A[i + 1] = key; 18 } 19 } 20 21 22 int main(){ 23 int i; 24 int A[6] = {5, 2, 4, 6, 1, 3}; 25 26 printf("A[]...\n"); 27 for(i = 0; i < 6; i++){ 28 printf("%d ", A[i]); 29 } 30 31 InsertSort(A); 32 33 printf("\nafter A[]...\n"); 34 for(i = 0; i < 6; i++){ 35 printf("%d ", A[i]); 36 } 37 38 system("pause"); 39 return 0; 40 }
运行截图如下: