1. 程式人生 > >插入排序-演算法導論筆記

插入排序-演算法導論筆記

  • 插入排序對於少量的資料它是一個有效的演算法。插入排序的工作方式像人手裡的撲克牌一樣。開始時我們手裡為空並且桌子上的牌面向下。然後我們每次從桌上拿走一張牌並將它插入手裡正確的位置。為了把這種牌插入正確的位置,我們要從右到左將它和已在手中的牌進行比較。如下圖:
    這裡寫圖片描述

  • 虛擬碼:

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。