快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較-交換。
快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k(通常選取第乙個元素),然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而k元素則恰好位於兩個子列中間。上述過程稱為一趟快速排序,接下來依次為兩個子串行進行快速排序,依次遞迴。當子串行的長度小於1時,遞迴停止。此時,原始序列已經成為乙個有序的序列了。
根據上面的思想,快速排序演算法的**實現如下所示。quicksort函式對原始序列遞迴進行快速排序,每次排序時先通過partiton函式得到序列中p到r元素間的分界點q,然後再分別對兩個子串行p到q-1和q+1到r進行快速排序。
1
void
quicksort(
int
*a,
int
p,
int
r)
2
8
}
partition函式是快速排序演算法的關鍵。該函式選取待排序序列的第乙個元素作為基準,通過反覆的比較-交換將p到r之間的元素分成兩組子串行,一組子串行的元素全部小於x,另一組子串行的元素全部大於x。
在具體的比較-交換過程中,設定兩個記錄點low和high,並在初始時將基準儲存到x中。然後不斷進行下面兩種掃瞄:
1.將high從右至左掃瞄,直到a[high] < x為止,由於此時的a[high]是第乙個小於基準x的元素,因此將a[high]和x交換。
2.將low從左至右掃瞄,直到a[low] >= x為止,由於此時的a[low]是第乙個不小於基準x的元素,因此將a[low]和x交換。
當low小於high時會一直持續上述兩種掃瞄,否則稱其完成了一次劃分過程。每一次的劃分過程就會得到分界位置,返回為quicksort函式。
01
int
partition(
int
*a,
int
p,
int
r)
02
17
output_data(a, n);
18
19
while
(low < high && a[low] < x)
20
low++;
21
if
(low < high)
26
output_data(a, n);
27
}
28
a[low] = x;
29
return
low;
30
}
演算法第二章 快速排序
先把快速排序的 實現貼上來,太晚了,過程改天再加上!快速排序就是把乙個數拿出來,然後把小於這個數的扔到一邊,把大於它的扔到一邊,那這個數就在正確的位置上了 然後把這個數的左邊分成乙份,右邊分成乙份,再把這兩份進行剛才的做法,一直不停地這樣做,直到不能再分。接下來就要說明怎麼把小於它的數扔到一邊,大於...
第二章 2 3 快速排序
本節的主題是快速排序,他可能是應用廣泛的排序演算法了。優點 缺點 非常脆弱,在實現時要非常小心才能避免低劣的效能。與歸併排序的比較 快速排序與歸併排序是互補的 歸併排序將陣列分成兩個子陣列分別排序,並將有序的子陣列歸併並以整個陣列排序 而快速排序將陣列排序的方式則是當兩個子陣列都有序時整個陣列也就自...
演算法 第二章排序
目錄 初級排序 選擇排序 插入排序 希爾排序 歸併排序 自頂向下排序 自底向上排序 快速排序 優先佇列 初級排序 一 選擇排序 簡述 選擇排序就是遍歷一遍陣列把最小的和第乙個數字交換。第二遍遍歷陣列時候選擇和第二個交換,一次類推。注意不要在for迴圈中用a.length 不然每次都要獲取a.leng...