快速排序中樞紐元的選擇會影響演算法的效率
快速排序中的樞紐元指的是乙個元素v,該元素將乙個數集s分成兩個互斥的集合s1和s2,s1中的任意元素均不大於v,s2中的任意元素均不小於v.
錯誤的選擇策略
1)沒有經過充分考慮,選擇將陣列的第乙個元素作為樞紐元。
如果輸入時隨機的,那麼這是可以接受的,但是如果輸入時預排序的或是反序的,那麼這樣的樞紐元就產生了乙個劣質的分割,即所有的元素不是全被劃入s1就是全被劃入s2。更有甚者,這種情況可能發生在所有的遞迴呼叫中。實際上,如果第乙個元素用作樞紐元且輸入時預排序的,那麼快速排序話費的時間將是二次的,雖然是花費了這麼多時間,但是卻沒有做什麼事情,這比較尷尬。
2)選取輸入中前兩個互異關鍵字中的較大者作為樞紐元。
可選的樞紐元選取策略
1)隨機選取樞紐元。這是一種比較安全的策略
見劍指offer
2)三數中值分割法。即隨機選取三個元素,並用它們的中值作為樞紐元。一般的做法是使用左端,右端和中間的三個元素的中值作為樞紐元。使用三數中值分割法消除了預排序輸入的壞情形
實際中的策略是:首選對a[left],a[rignt],a[center]進行從小到大排序,經過該操作後,三元素的最大者被放到了a[right],最小者被放到了a[left],a[center]中的元素大小居中,這樣就可以作為樞紐元。由於a[right]大於樞紐元,我們可以把樞紐元放到a[right--1],並在分割階段將左右的遍歷索引i和j分別置為left+1,right-2.
這樣操作的好處是,因為此時a[left]比樞紐元小,所以將它作為j的警戒標記,因此我們不用擔心j越界;由於i將停在那些等於樞紐元處,故將樞紐元儲存在a[right-1],將提供乙個警戒標記。
快速排序裡的學問 樞紐元選擇與演算法效率
選擇首尾元素做樞紐元 通常的 沒有經過充分考慮的選擇是將第乙個或最後乙個元素用作樞紐元。選擇第乙個元素作為樞紐元的程式例子可以參考專題的前一篇 快速排序裡的學問 霍爾快排的實現 而選擇最後乙個元素用作樞紐元的程式例子則可以參考 快速排序裡的學問 快速排序的過程 這個演算法導論裡的例子。選擇最後乙個元...
分治策略 快速排序
快速排序演算法是基於分治策略的另乙個排序演算法。其基本思想是 對輸入的子陣列a p r 按以下三個步驟進行排序。1 分解 divide 以a p 為基準元素將a p r 劃分成3段a p q 1 a q 和a q 1 r 使得a p q 1 中任何乙個元素小於等於a q 而a q 1 r 中任何乙個...
隨機選擇策略的快速排序
subject 計算機演算法設計與分析 title 2.8.2隨機選擇策略的快速排序 coder hao class 計科0906 num 0304090614 date oct 2nd,2011 programming language c include using namespace std ...