題目:演算法-排序-快速排序(quicksort)分析
摘要:
此文介紹了快速排序的演算法以及基本分析,最後總結。
此系列文均為方便日後重複粗略檢視時不必翻看書籍。
快速排序詳細分析簡要介紹給出了非常詳細的partition時各種掃瞄方式, 以及介紹分治時尾遞迴的方式。
值得學習
快速排序通過劃分陣列為分別大於和小於key的兩個連續部分,進而遞迴實現排序。
它的特點包括:
1. 就地排序(in place): 不需要更多的記憶體空間
2. 遞迴呼叫:思路簡單
1. 最壞情況
2. 平均情況
, 而且隱含的常數因子很小。 (何謂隱含的常數因子?…, to be idtendified)
演算法過程
quick sort過程 ([2],p85)quicksort(a , p , r )
1ifp
< r
2thenq ← partition(a , p , r )
3 quicksort(a , p , q - 1)
4 quicksort(a , q + 1, r )
quick sort中用到的partition過程 ([2],p85)partition(a , p , r )
1 x ← a [r ]
2 i ← p - 1
3forj ← ptor - 1
4do ifa [j ] ≤ x
5theni ← i + 1
6 exchange a [i ] ↔ a [j ]
7 exchange a [i + 1] ↔ a [r ]
8returni + 1
下圖([2] 圖7-2)非常好的描述了partition過程中陣列元素的位置分布情況。
下面簡單介紹一下partition的迴圈中某一次的資料編排方式:
if (array[j] > x,
j++
else
i++, j++,
exchange array[i] array[j-1]演算法簡單分析
演算法簡單分析中,將著重以傳達意思為主,不會涉及嚴格的數學公式證明。總結注意:每次劃分n個元素的時間代價為 thet(n). 不論劃分結果如何.
假設對n個元素排序所需時間為 t(n)
最壞情況:
最壞情況為劃分的兩個區域分別包含 n-1 個 和 0 個元素,
即:每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄。
這樣接下來的n-1個元素劃分的時間為t(n-1)。
這樣我們得到
t(n)=t(n-1)+thet(n)
看到這個公式,根據基本概念,可以知道其複雜度為thet(n平方). 當然也可以通過[2]中的主定理證明。
思考:如果輸入資料已經排好序,不論正序或者倒序,都將造成最壞情況。
最佳情況:
最佳情況為兩個區域個包含 n/2個元素,這樣
t(n)=2t(n/2)+thet(n)
再由主定理 複雜度為 thet(nlgn)
思考1:merge sort的公式為t(n) = 2 t(n/2) + thet(n), 其時間複雜度為 thet( n * log n ). 為什麼不直接使用merge sort?
因為merge sort需要太多的memory。
思考2:這裡,我們一定要有這樣的思維,目前我們碰到的merge sort, quick sort都出現了t(n) = t ( an+b ) + thet(n)類似的公式。
也就是說,有可能大部分簡單的排序演算法都可以通過分而治之(divide and conquer), 分步法等簡要直白的方式,將問題簡化為此類公式。
此公式方便的開啟了演算法分析之門。
思考3:merge sort最大可能使用多少記憶體?todo
我們知道,我們無法決定每次劃分的情況。但是我們知道只要每次劃分出現一定隨機化分布,就會得到比較好的劃分結果,至少不會最差。
我們通過每次選擇參照的元素時,不直接選取最後乙個,而是隨機選取(random sampling),就可以輕易達到效果。
同時,不用擔心對原有partition程式的乖動,我們只要在隨機選取後,將隨機樣本與陣列最後元素交換位置即可。
如下:randomized-partition(a, p, r)
1. i
2. exchange a[r] a[i]
3. partition(a, p, r)
randomized-quicksort(a, p, r)
1. if p < r
2. then q
3. randomized-partition(a, p, q-1)
4. randomized-partition(a, q+1, r)
演算法進一步分析
todo
todo。
[1]. 演算法分析導論 section1.4平均情形分析,1.5例:快速排序的分析
[2]. 演算法導論,ch,v2, chapter 7 快速排序
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...