歸併 高速分揀

2021-09-07 03:33:13 字數 1678 閱讀 4588

我們都知道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...