希爾排序,快速排序,堆排序
阿新 • • 發佈:2018-11-12
最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。
希爾排序
當序列增量為incr[k]=2(t-k+1)-1時,時間複雜度為O(n1.5)。以序列增量分組,對每組進行大小調整。
template<class T> void ShellInsert(T elem[],int n,int incr) { for(int i=incr;i<n;i++) { T e=elem[i]; for(int j=i-incr;j>=0&&e<elem[j];j-=incr) elem[j+incr]=elem[j]; elem[j+incr]=e; } } template<class T> void ShellSort(T elem[],int n,int incr[],int t) { for(int k=0;k<t;k++) ShellInsert(elem,n,incr[k]); }
快速排序
快速排序被公認為在所有同數量級O(nlogn)的排序演算法中平均效能最好,但如果原序列有序時,快速排序將蛻化為起泡排序,時間複雜度為O(n^2).
template<class T> int Patition(T elem[],int low,int high) {//找到序列中一個數使得左邊的數都比他小,右邊的數都比他大。 while(low<high) { while(low<high&&elem[low]<=elem[high]) high--; Swap(elem[low],elem[high]); while(low<high&&elem[low]<=elem[high]) low++; Swap(elem[low],elem[high]); } return low; } template<class T> void QuickSortHelp(T elem[],int low,int high) {//進行遞迴調整 int pos=Partition(elem,low,high); QuickSortHelp(low,pos-1); QuickSortHelp(pos+1,high); } template<class T> void QuickSort(T elem[],int n) { QuickSortHelp(elem,0,n-1); }
堆排序
最壞情況下時間複雜度為O(nlogn),只佔用一個用於臨時交換的臨時儲存空間
template<class T> void SiftAdjust(int elem[],int high,int low) {//elem中除elem[low]外均符合堆的定義,調整elem[low]使其成為大頂堆 for(int f=low,i=2*f+1;i<=high;i=2*i+1) { if(i<high&&elem[i]<elem[i+1]) i++; if(elem[f]>=elem[i]) break; Swap(elem[f],elem[i]); f=i; } } template<class T> void HeapSort(int elem[],int n) {//先將整個陣列調整為大頂堆,再將最大的元素與最後一個元素交換,調整其成為大頂堆 int i; for(i=(n-2)/2;i>=0;i--) SiftAdjust(i,n-1); for(i=n-1;i>=0;i--) { Swap(elem[0],elem[i]); SiftAdjust(0,i-1); } }