1.歸併排序 時間複雜度O(nlogn) 輔助空間O(n) 穩定void merge_sort(int *A,int x,int y,int *T) //對數組A [x,y)排序 數組T是輔助空間{ if(y-x>=2) //至少有兩個元素才排序 { int m=x+(y-x)/2; //第一步劃分 int p=x,q=m,i=x; merge_sort(A,x,m,T); //第二步遞迴求解 merge_sort(A,m,y,T); while(p<m||q<y) //第三步合并 { if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++]; else T[i++]=A[q++]; } for(i=x;i<y;++i) //從輔助空間複製回A數組 A[i]=T[i]; }}
2.快速排序 時間複雜度O(nlogn) 輔助儲存O(logn) 不穩定void QuickSort(int A[],int p,int r) //對數組A [p,r]{ if(p<r) //至少有兩個元素 { int q=Partition(A,p,r); QuickSort(A,p,q-1); //對左半段排序 [p , q-1] QuickSort(A,q+1,r); //對右半段排序 [q+1,r ] }}int Partition(int A[],int p,int r){ int i=p,j=r+1; int key=A[p]; //將小於key的元素交換到左邊地區,將大於key的元素交換到右邊地區 while(true) { while(A[++i]<key&&i<r) ; //空語句 while(A[--j]>key) ; //空語句 if(i>=j) break; swap(A[i],A[j]); } swap(A[j],A[p]); return j;}
3.二分尋找int bsearch(int *A,int x,int y,int v) //在有序數組A [x,y) 尋找v{ int m; while(x<y) { m=x+(y-x)/2; if(A[m]==v) return m; else if(A[m]>v) y=m; //[x,m) else x=m+1; //[m+1,y) } return -1; //尋找失敗}