快速排序裡的學問 樞紐元選擇與演算法效率

2022-03-14 03:44:37 字數 872 閱讀 6477

選擇首尾元素做樞紐元

通常的、沒有經過充分考慮的選擇是將第乙個或最後乙個元素用作樞紐元。選擇第乙個元素作為樞紐元的程式例子可以參考專題的前一篇《快速排序裡的學問:霍爾快排的實現》,而選擇最後乙個元素用作樞紐元的程式例子則可以參考《快速排序裡的學問:快速排序的過程》這個演算法導論裡的例子。

選擇最後乙個元素作為樞紐元的排序過程是這樣的:

如果輸入是隨機的,那麼這是可以接受的,但是如果輸入是預排序的或者是反序的,那麼這樣的樞紐元就產生乙個劣質的分割,因為所有的元素不是被劃入s1就是被劃入s2。更有甚者,這種情況發生在所有的遞迴呼叫中。

實際上,如果第乙個元素用作樞紐元而且輸入是預先排序的,那麼快速排序所花費的時間將是二次的。然而,預排序的輸入(或者有一大段預排序資料的輸入)也是相當常見的,因此,使用第乙個元素作為樞紐元的演算法效率不是很高的。

另一種想法是選取前兩個互異的鍵中的較大者作為樞紐元,但這和只選取第乙個元素作為樞紐元效率也差不多。

隨機選取樞紐元

一種安全的方針是隨機選取樞紐元。

一般來說這種策略非常安全,除非隨機數生成器有問題,因為隨機的樞紐元不可能總在接連不斷地產生劣質的分割。另一方面,隨機數的生成一般是昂貴的,根本減少不了演算法其餘部分的平均執行時間。

三數中分割法

一組n個數的中值是第[n/2]個最大的數。樞紐元的最好的選擇是陣列的中值。

可是,這很難算出來,並且會明顯減慢快速排序的速度。這樣的中值的估計可以通過隨機選取三個元素並用它們的中值作為樞紐元而得到。事實上,隨機性並沒有多大的幫助,因此一般的做法是使用左端、右端和中心位置上的三個元素的中值作為樞紐元。顯然使用三數中值分割法消除了預排序輸入的不好情形。

這種樞紐元選擇的的快排,效率可是相當高的。

快速排序還很有很多各種變種,我們這裡只研究幾個有代表性的演算法。

快速排序的樞紐元選取策略

快速排序中樞紐元的選擇會影響演算法的效率 快速排序中的樞紐元指的是乙個元素v,該元素將乙個數集s分成兩個互斥的集合s1和s2,s1中的任意元素均不大於v,s2中的任意元素均不小於v.錯誤的選擇策略 1 沒有經過充分考慮,選擇將陣列的第乙個元素作為樞紐元。如果輸入時隨機的,那麼這是可以接受的,但是如果...

快速排序裡的學問 從猜數字開始 猜數字裡的演算法思想

我們先來玩乙個猜數字遊戲 我心裡默念乙個1 64之間的數,你來猜 你只能問答案是 是 或 否 的問題 為了保證不論在什麼情況下都能以盡量少的次數猜中,你應該採取什麼策略呢?很顯然,二分。先是猜是不是位於1 32之間,排除掉一半可能性,然後對區間繼續二分。這種策略能夠保證無論數字怎麼跟你捉迷藏,都能在...

快速排序裡的學問 從猜數字開始 猜數字裡的演算法思想

我們先來玩乙個猜數字遊戲 我心裡默念乙個1 64之間的數,你來猜 你只能問答案是 是 或 否 的問題 為了保證不論在什麼情況下都能以盡量少的次數猜中,你應該採取什麼策略呢?很顯然,二分。先是猜是不是位於1 32之間,排除掉一半可能性,然後對區間繼續二分。這種策略能夠保證無論數字怎麼跟你捉迷藏,都能在...