插入排序演算法
阿新 • • 發佈:2020-07-20
插入排序
618買了本演算法導論,考完試10號,旅遊完回來15號,又出去聚會了兩天,終於開始學習了= =
第一個演算法就是這個插入排序,道理很簡單,後一個數和前一個數比較大小,交換順序,最終按大小排好順序。下面放一張原理圖:
上圖中還給出了虛擬碼,然後我稍作修改,用c寫出了這個程式:
#include<stdio.h> void InsertionSort(int []); int main() { int a[5], i; for(i = 0; i < 5; i++) { scanf("%d", &a[i]); } InsertionSort(a); for(i = 0; i < 5; i++) { printf("%d ", a[i]); } printf("\n"); return 0; } void InsertionSort(int num[]) { int j, k, key; for(j = 1; j < 5; j++) { key = num[j]; k = j - 1; while(k >= 0 && num[k] > key) { num[k + 1] = num[k]; k = k - 1; } num[k + 1] = key; } }
測試結果如下:
在程式碼的第26行,把 num[k] > key 改成 num[k] < key 就能實現降序排序。
再說一下迴圈不變式,它的三個性質:初始化、保持、終止,可以幫助判斷演算法的正確與否。
保持這一性質是判斷演算法是否正確很關鍵一點,要保證每次迭代時 A[j] 之前的數已經排好序。
這個插入排序還是挺簡單的,容易理解而且程式碼量少,後面就要學分析演算法,看的一臉懵逼。這本書估計大四都學不完了orz
爭取3天更一次博