學習演算法導論 快速排序

2021-07-10 05:46:13 字數 980 閱讀 6351

快速排序用的也是分治法,快速排序分為三個步驟:

1.分解

陣列a[low..high]被劃分為兩個(可能為空)的子陣列a[low...q-1]和a[q+1...high],使得a[low...q-1]中的每個元素都小於等於a[q],而a[q]小於等於a[q+1...high]中的每個元素。

q是乙個劃分點。

2.解決

通過遞迴呼叫快速排序,對字陣列a[low...q-1]和a[q+1...high]進行快速排序。

3.合併

因為字陣列都是原址排序的,所以不需要合併操作。

c++**:

unsigned partition(unsigned a, unsigned low, unsigned high)

} unsigned temp = a[i+1];

a[i+1] = a[high];

a[high] = temp;

return i + 1;

}

void quick_sort(unsigned a, unsigned low, unsigned high)

}

partition()函式是找乙個分界點,它的原理是這樣的:

定義乙個"指示器"i,i所指的位置a[i]往左到a[0]均是小於等於分界數的,i+1到j-1這個區間的值都是大於等於分界數的。所以,只要j迴圈時找到乙個小於等於分界數的值,那麼就a[i=1]和a[j]交換,指示器i+1。因為以最後乙個值為分界數,所以迴圈到倒數第二個值時結束,這時,只要把a[i+1]和最後的分界數交換就行。

過程如圖:

(來自演算法導論)

快速排序 演算法導論

對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 的排序演算法。雖然最壞情況時間的複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好 它的期望時間複雜度是o nlgn 而且o nlgn 中隱含的常數因子非常小,另外,它還能夠進行原址排序,甚至在虛存環...

演算法導論 快速排序

既然敢叫 快速排序 必然有其過人之處。事實上,它確實是最快的通用內部排序演算法。它由hoare於1962年提出,相對歸併排序來說不僅速度快,並且不需要輔助空間。對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 2 的排序演算法。雖然最壞情況時間複雜度差,但是快速排序通常是實際排...

《演算法導論》 快速排序

最近和朋友聊天,聊到企業面試時考了一道鍊錶的快排,這道題在leetcode上也刷到過,而且對於陣列的快排,真是從大學到研究生一直都要求必須掌握的重點知識,然而自己不斷的思考,卻發現所謂的快排,比我以前想象的要複雜的多,因為快排的思想非常幹練,但是形式,或者說具體實現千變萬化,為了達到萬變不離其宗,筆...