演算法設計與分析:第二章 遞迴 2.6基於遞迴的插入排序
阿新 • • 發佈:2019-02-02
/* 基於遞迴的插入排序: 將待插入的關鍵字插入到已經排好序的序列中 遞迴基:當陣列元素個數n=1時,只有一個元素,已經是排序的 遞迴步:如果前面k-1個元素已經排序,只要將第k個元素逐漸與 前面k-1個元素比較,把他插入到適當位置,即可完成k個元素的排序 遞迴的規律總結: 一般先執行遞迴,再執行遞迴體,這樣就可以把基本的操作放在最後完成了。 樣例輸入: 4 1 4 3 2 10 1 9 8 5 6 3 4 2 0 7 樣例輸出: 1 2 3 4 0 1 2 3 4 5 6 7 8 9 */ #include <stdio.h> const int MAXSIZE = 10000; void insertSort_recursion(int* pArr,int n) { if(!pArr || n <= 0) { return; } n--;//注意,我們儲存的陣列元素範圍仍然是0~n-1 int iReserveNum;//記錄待比較元素 if(n > 0)//遞迴主體 { insertSort_recursion(pArr,n);//先執行遞迴,這樣最小操作會放在最後完成 iReserveNum = pArr[n]; int k = n - 1; while(k >= 0 && pArr[k] > iReserveNum)//前>後,後移 { pArr[k+1] = pArr[k];//後移 k--; } pArr[k+1] = iReserveNum; } } void print(int* pArr,int iLen) { if(!pArr || iLen <= 0) { return; } for(int i = 0 ; i < iLen ; i++) { if(i) { printf(" %d",pArr[i]); } else { printf("%d",pArr[i]); } } printf("\n"); } void process() { int n; int iArr[MAXSIZE]; while(EOF != scanf("%d",&n)) { if(n <= 0) { break; } for(int i = 0 ; i < n ; i++) { scanf("%d",&iArr[i]); } insertSort_recursion(iArr,n); print(iArr,n); } } int main(int argc,char* argv[]) { process(); getchar(); return 0; }