在閱讀此博文前,請先閱讀我的博文「c#排序演算法——基類設計 「,以了解基類的結構。
在編寫**前,我們先來了解二路歸併法的排序過程:
假設有乙個ilist型的集合list(集合的元素為list[0]到list[n-1], n = list.count)。
第1步:從a[0 : n - 1]中選擇乙個元素作為middle,該元素為支點。
第2步:把餘下的元素分割為兩段left和right,使得left中的元素都小於等於支點,而right中的元素都大於等於支點。
第3步,遞迴地使用快速排序方法對left 進行排序。
第4步,遞迴地使用快速排序方法對right 進行排序。
很顯然,快速排序法同樣使用了遞迴呼叫。根據上面的演算法,我們開始編碼了:
using system;
using system.collections.generic;
using system.text;
namespace cyb.datastruct.sorting
/// 子集的起始索引號
/// 子集的終止索引號
private
void quicksort(ilistlist, int left, int right, comparedelegatecompare)
int l = left + 1; //從左往右掃瞄的游標
int r = right; //從右往左掃瞄的游標
t pivot = list[left]; //選擇最左端元素作為支點
while ( true )
//從右往左掃瞄找出所有大於支佔的元素
while (compare(list[r], pivot) > 0)
if (l >= r)
else
} //將支點移到中間
list[left] = list[r];
list[r] = pivot;
//遞迴地使用快速排序法對由支點作為邊界的左右子集進行排序
quicksort(list, left, r - 1, compare);
quicksort(list, r + 1, right, compare);
} } }
排序演算法 快速排序法
1 無論是冒泡法 堆排序法還是歸併法排序,都是重複找到陣列中剩餘未排序元素的最大或最小值,然後將每次找到的最大或最小值依次放進陣列中就可以得到乙個有序的陣列。快速排序法也與其類似,但不同的是,快速排序是通過任意指定陣列中的乙個元素作為基準,比該元素大的放在右邊,比該元素小的放在左邊,這樣就可以保證指...
排序演算法 快速排序(分治法)
思想 快速排序採用的思想是分治思想。快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n 1個元素也調整到排序後的正確位置。最...
演算法排序(六) 快速排序法
快速排序法一般來說可以分為三種,分別是 基礎快速排序法 雙路快速排序法 三路快速排序法 下面分別對以上三種快排進行梳理。排序思路 首先傳入待排序陣列,使用變數l表示陣列下標起點,使用變數r表示陣列下標終點,然後取陣列第乙個元素e做中介,使用迴圈逐步將陣列元素分為比e小和不比e小的兩部分 使用變數j記...