快速排序裏的學問:樞紐元選擇與算法效率
每一練習都是一次積澱,終將成就不一樣的自己。下面是小編整理的快速排序裏的學問之樞紐元選擇與算法效率,希望對大家有用,更多消息請關注應屆畢業生網。
選擇首尾元素做樞紐元
通常的、沒有經過充分考慮的選擇是將第一個或最後一個元素用作樞紐元。選擇第一個元素作為樞紐元的程序例子可以參考專題的前一篇《快速排序裏的學問:霍爾快排的實現》,而選擇最後一個元素用作樞紐元的程序例子則可以參考《快速排序裏的學問:快速排序的過程》這個算法導論裏的例子。
選擇最後一個元素作為樞紐元的排序過程是這樣的:
如果輸入是隨機的,那麼這是可以接受的,但是如果輸入是預排序的或者是反序的,那麼這樣的樞紐元就產生一個劣質的分割,因為所有的元素不是被劃入S1就是被劃入S2。更有甚者,這種情況發生在所有的遞歸調用中。
實際上,如果第一個元素用作樞紐元而且輸入是預先排序的`,那麼快速排序所花費的時間將是二次的。然而,預排序的輸入(或者有一大段預排序數據的輸入)也是相當常見的,因此,使用第一個元素作為樞紐元的算法效率不是很高的。
另一種想法是選取前兩個互異的鍵中的較大者作為樞紐元,但這和只選取第一個元素作為樞紐元效率也差不多。
隨機選取樞紐元
一種安全的方針是隨機選取樞紐元。
一般來説這種策略非常安全,除非隨機數生成器有問題,因為隨機的樞紐元不可能總在接連不斷地產生劣質的分割。另一方面,隨機數的生成一般是昂貴的,根本減少不了算法其餘部分的平均運行時間。
三數中分割法
一組N個數的中值是第[N/2]個最大的數。樞紐元的最好的選擇是數組的中值。
可是,這很難算出來,並且會明顯減慢快速排序的速度。這樣的中值的估計可以通過隨機選取三個元素並用它們的中值作為樞紐元而得到。事實上,隨機性並沒有多大的幫助,因此一般的做法是使用左端、右端和中心位置上的三個元素的中值作為樞紐元。顯然使用三數中值分割法消除了預排序輸入的不好情形。
這種樞紐元選擇的的快排,效率可是相當高的。
快速排序還很有很多各種變種,我們這裏只研究幾個有代表性的算法。
-
提高PHP執行效率的50個技巧
PHP是一種HTML內嵌式的語言,是一種在服務器端執行的嵌入HTML文檔的腳本語言,下面是小編為大家整理的提高PHP執行效率的50個技巧,歡迎參考~1、用單引號代替雙引號來包含字符串,這樣做會更快一些。因為PHP會在雙引號包圍的字符串中搜尋變量,單引號則不會,注意:只有echo...
-
PHP中用CURL偽造IP來源的方法
PHP中用CURL偽造IP來源的.方法,有需要的朋友可以看看。就跟隨本站小編一起去了解下吧,想了解更多相關信息請持續關注我們應屆畢業生考試網!1.文件複製代碼代碼如下:<?php$ch=curl_init();curl_setopt($ch,CURLOPT_URL,"http://localhost/");curl_setopt($ch,CURL...
-
ini函數解析
PHP獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。以下是小編為大家搜索整理的ini函數解析,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!t、ini_get_all、ini_restore。個人感覺最有用的就...
-
作為程序員必知的16個最佳PHP庫
PHP是一種功能強大的web站點腳本語言,通過PHP,web網站開發者可以更容易地創建動態的引人入勝的web頁面。開發人員可以使用PHP代碼與一些網站模板和框架來提升功能和特性。然而,編寫PHP代碼是一個繁瑣又耗時的過程。為了縮短開發時間,開發人員可以用PHP庫替代編寫代...