3.2 快速排序
快速排序綜合效能優越,其主要思想在於找乙個pivotvalue,通過不斷的比較、交換,將序列變成pivotvalue前的值都比它小,在其後的值都比它大;然後,再對pivotvalue前面的序列和後面的序列分別使用同樣的方法得到具有該性質的序列.....不斷遞迴呼叫至最底層即排好序。其基本流程如圖 1所示。
圖 1 快速排序基本流程
分析快速排序的時間複雜度,可以畫出乙個二叉樹,二叉樹的結點即是每一層遞迴選用的pivotvalue。顯然,如果pivotvalue選擇得當,使得遞迴呼叫的二叉樹為完全二叉樹,則樹的深度為lgn,快速排序的時間複雜度是o(nlgn)。但如果pivotvalue的值選的不好,在最壞的情況下,遞迴呼叫成了線性表,則樹的深度為n,快排的時間複雜度為n2。
所以,快排的效能很大程度上取決於pivotvalue的選取,原則應盡量使得pivotvalue為待排序的中間值。上面介紹的是選擇順序表第乙個元素作為pivotvalue,更好的做法是三數取中法,即去a[low]、a[high]以及a[(high+low)/2]三者中的中間值作為樞軸pivotvalue,這樣它成為待排序列中間值的概率會大很多。
另外一處可以優化的地方是,從圖中可以發現,在遞迴前處理中做了很多的交換,但可以發現,由於high和low的不斷向中間靠攏,比較完後的值不會在參與本層遞迴的比較了,所以可以採取替換代替交換的方法,直接替換原來待交換的位置的值為交換以後的值即可。
分析快速排序演算法的空間複雜度,由於用了遞迴,需開闢棧空間,棧空間的大小即為二叉樹的深度,根據上述分析可知,快排空間複雜度為o(lgn~n)。
快排由於跳躍著交換位置,是一種不穩定的排序演算法。
總結快速排序的時間、空間複雜度,穩定性以及適用場合如圖 2。
圖 2 快速排序演算法相關
最後,快速排序用了遞迴,歸併排序也有遞迴的演算法,我想了一下它倆的區別。
快速排序和歸併排序的區別在於,歸併排序通過遞迴分別將前一半和後一半排好序以後,整個序列還不是有序的,需要重新迴圈進行乙個排序的步驟;但快速排序由於設定了pivotvalue,通過來回交換,已經使得前一步的所有值小於後一半的所有值了,所以分別遞迴排好了前一半和後一半,整個序列就是有序的了。簡單來說就是,快速排序進行了遞迴的前處理,歸併排序則進行了遞迴的後處理。
資料結構與演算法小結 排序(三)
2.選擇排序 2.1 簡單選擇排序 簡單選擇排序的主要思想是,對第i個元素,將其與後面的n i個元素作比較,用乙個min變數儲存這n i 1個元素中的最小值的位置,比較完後將a min 和a i 交換 min i 簡單選擇排序進行了 n 2 2次比較,n次交換,交換的次數少。其主要過程如圖所示 簡單...
資料結構與演算法小結 排序(二)
1.2 希爾排序 希爾排序屬於插入排序的一種,是直接插入排序的優化,其主要思想是 由於在序列基本有序的情況下,直接插入排序的效率很高,那麼,我們引入乙個增量incre,把以incre為間隔的元素做一次直接插入排序,使其基本有序 隨後,incre慢慢減小,繼續做上述直接插入排序,最後incre變成1,...
資料結構與演算法 排序演算法之六 快速排序
一 快速排序 排序演算法中的奧斯卡,諾貝爾獎,當屬快速排序!快速排序是20世紀十大演算法之一!1 基本思想 前面提到氣泡排序,它是一種交換排序,堪稱最慢的排序演算法。可是,物極必反,快速排序是氣泡排序的公升級加強版,同屬於交換排序類。以 空間 換時間,快速排序不是相鄰元素的交換,而是加大了比較和交換...