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天更一次博学习