插入排序是算導第一個分析的算法。
之前看了很多遍,一直沒有把習題做了,現在好好把習題和思考題做做,鍛煉自己能力,順便用C語言實現經典算法和數據結構。
最基礎的插入排序是對前n-1項數據進行反向掃描。實現很簡單,運行時間也很容易的出,直接貼代碼:
void insertion_sort(int A[], int length) { int i, j; int key; for(j = 1; j < length; j++) { key = A[j]; i = j - 1; while(i >= 0 && A[i] > key) { A[i+1] = A[i]; i--; } A[i+1] = key; } }
練習題2.3-4要求將插入排序改寫成遞歸過程。實現也是比較簡單。
void insertion(int A[], int length){ if(length != 1){ int key = A[length-1]; int i = length-2; while(i >= 0 && A[i] > key){ A[i+1] = A[i]; i--; } A[i+1] = key; } } void insertion_sort(int A[], int length){ if(length > 1){ insertion_sort(A, length-1); insertion(A, length); } }
練習2.3-6要求將最基礎版本中的線性查找策略改成二分查找。
int binary_search(int A[], int key, int end){ int i = 0; int j = end; int m; while(i < j){ m = (i + j) / 2; if(key > A[m]){ i = m + 1; } else{ j = m; } } if(A[i] >= key) return i; else return i + 1; } void insertion_sort(int A[], int length){ int i, j; int key; int pos; for(j = 1; j < length; j++) { key = A[j]; pos = binary_search(A, key, j-1); for(i = j-1; i >= pos; i--) A[i+1] = A[i]; A[pos] = key; } }