我們都知道stl排序庫函式最常用的:sort(v.begin(),biend())。
這是由於在以公升序。
我一般不喜歡用乙個迭代器,我一般用這種格式。排序的陣列,替代指標迭代器。
sort(a,a+n)//公升序排序
sort(a,a+n,cpm);
int cmp(type a,type b)
這裡我們來手動實現歸併排序和快素排序,對於快排排序。我們知道它的執行效率和關鍵字的a[p]選擇有關。我們這裡沒有考慮,即沒有給出隨機選擇下標的演算法。值給出了普通的關鍵**。讀者能夠自己實現隨機的快排函式,而歸併排序也是僅僅給出了遞迴的程式。
歸併排序:
*是一種遞迴的排序演算法,對於輸入陣列a[1..n],
*我們能夠先排序前半段a[1..n/2],和後半段a[n/2+1..n];
*然後在合併到a[1..n],此時a[1..n]以完畢排序
*演算法分析:
*1、分解:將n個元素分成含有n/2個元素的子串行
*2、解決:用合併平排序法對兩個子串行遞迴的排序
*3、合併兩個已排序的子串行得到排序結果
*注:對於子串行,其長度為1時。遞迴結束,單個元素被視為已排序
/**
*對於排好序的子陣列a[l..m]和a[m+1..r]。-->a[l..r](已排序)
*/void merge(int *a,int l,int m,int r)
//處理尾部
while(i<=m)
while(j<=r)
//copy(a,b)
for(i=l;i<=r;i++)
delete b;
}/**
*歸併排序。呼叫mergesort(a,1,n);
*/void mergesort(int *a,int l,int r)
}
高速排序quicksort(a,1,n);
*演算法例如以下:
*1、分解將陣列a[p..r]劃分為兩個字陣列a[p..q-1]和a[q+1..r],使得
* a[p..q-1]中的每乙個元素都小於等於a[q],而且,小於等於a[q+1..r]。
* 下標q也在這個劃分過程中確定,已q為分界線劃分
*2、解決遞迴高速排序,對字陣列a[p,q-1]和a[q+1..r],此時a[q]已在排序後的位置
*3、由於兩個字陣列是就地排序的。不需合併就已經排好序
**:
/**
*劃分函式
*/int quick_init(int *a,int p,int r)
}swap(a[p],a[j]);//將關鍵字與最後乙個j的位置交換。此時a[p]已完畢排序
return j;//返回關鍵字的位置
}void quicksort(int *a,int p,int r)
}測試主程式:
int main()
; pt(a,8);
mergesort(a,1,8);
quicksort(a,1,8);
pt(a,8);
return0;}
注:pt(a,n)的定義為
#define pt(a,n) for(int i=1;i<=n;i++) cout<" "; cout<
交換排序高速分揀
高速排序 quick sort 也是一種交換排序,它在排序中採取了分治策略。從待排序列中選取一元素作為軸值 也叫主元 將序列中的剩餘元素以該軸值為基準,分為左右兩部分。左部分元素不大於軸值,右部分元素不小於軸值。軸值終於位於兩部分的切割處。對左右兩部分反覆進行這種切割,直至無可切割。從高速排序的演算...
高速分揀函式模板
在這段時間stl比較痴迷,然後做一些調查,今天,高速的排序演算法最初寫模板函式再次寫,貼分享 有兩個版本號,能夠傳入比較器,自定義排序規則 高速排序演算法思路 1 從序列中選出乙個元素作為基準 2 重排序列,全部比基準小的元素位於基準左側。比基準大的元素位於基準右側。和基準相等的元素位於隨意一側,此...
高速分揀(1)的基本演算法
高速排序演算法的效能分析 參考資料 高速排序是一種分治排序演算法。它將陣列劃分為左右兩個部分,然後分別對這兩部分排序。關鍵在劃分的過程中。它將重排陣列,使的下面條件成立 我們通過劃分完畢排序。然後遞迴的呼叫該方法處理子檔案,每一次劃分都會至少使乙個元素放到它終於的位置上。void quick sor...