考慮快速排序為什麼最壞情況下時間複雜度為o(n
2)?這是因為每次進行劃分的時候,都有乙個部分大小為0(或者說為乙個常數)。如果我們能夠找到一種時間複雜度為o(n)的劃分方法,使得劃分後的兩部分大小均為θ(n),則快速排序的時間複雜度總能為θ(nlogn)。
假設我們能夠用非常小的代價尋找5個元素中的中位數,則我們可以遞迴的將原陣列劃分為大小為5的子陣列,尋找每個子陣列的中位數。容易證明,通過這種方式最終找到的中位數,至少存在θ(n)的元素比它小(大)。
首先介紹插入排序的一種簡單的改進,這一方法將在稍後用到。插入排序將陣列劃分為兩部分:已序部分和待排序部分。每次從待排序部分中取出乙個數,插入到已序部分中並保持其有序性。可以想到,在已序部分中使用二分查詢,則可以在o(logn)的時間內,找到待插入元素的位置。
這裡有乙個小技巧,是僅使用7次比較,完成5個元素的排序的基礎。
考慮對3個元素排序,至少需要幾次比較?答案是3次。但是如果有4個元素,要求對其中的3個元素建立全序關係,至少需要幾次比較呢?答案仍然是3次。方法如下。假設有四個元素a、b、c、d。如下圖所示,在a和b之間進行一次比較,在c和d之間進行一次比較,將這兩次比較中較大的元素再進行一次比較,則至少有3個元素能夠確定全序關係。
現在,我們僅通過3次比較,不僅得出了3個元素的全序關係,還知道另外乙個元素與這3個元素中的乙個元素的序關係。
假設有5個元素:a、b、c、d、e。
首先,我們使用3次比較,確定3個元素的全序關係,並且還額外的知道了另外乙個元素與這3個元素中的乙個元素的序關係。例如:a
< b
< c且a
< d。
接著,我們使用折半查詢將e插入到已序序列a、b、c中,至多需要2次比較。然後得到已序序列a、b、c、e。
由於最開始我們已經知道了剩下的未排序元素與已序序列中乙個元素的序關係,因此至少可以排除掉乙個元素。相當於將剩下的未排序元素插入到乙個長度為3的已序序列,至多需要2次比較。例如將d插入到已序序列a、b、c、e中,已知a
< d,則只需考慮將d插入到已序序列b、c、e中。
綜上所述,至多需要7次比較,即可完成5個元素的排序。
有的時候,有些問題看似是在不可能中尋找可能,實際上卻是需要我們換一種角度來看待問題。正所謂山窮水復疑無路,柳暗花明又一村。只要我們不放棄,從多種角度思考問題,總會有解決的方法的。
演算法中對於用七次比較完成5個元素的排序
一開始自己經過了好長時間的思考,都沒有完成這個問題的排序,在最終經過暗暗下定決心,終於完成了這道題目的求解,下面將我的分析思路寫下來,希望我平實的語言可以幫助你理解這個題目。對於五個元素a,b,c,d,e的排序,我們需要借鑑3個元素排序和四個元素中對於3個元素建立全序的思想,下面我們就來看看它們的思...
一次比較坑的裝系統過程
b color green size large 昨天晚上,幫朋友的thinpad e431系列的電腦重灌64位系統,本來這都不是什麼難事,系統很快就裝了,然後接下來,就是各個驅動了,理想的情況下是系統裝完之後,直接連上無線網,然後下個驅動精靈,或者去官網上下個一鍵安裝驅動包,這樣就很能很快完事。u...
記一次比較 Low 的 SQL 優化經歷
select from select row rownum rownum from select k18.ks1800,k18.ks1801,k17.ks1701,k17.ks1703,k17.ks1704,as ks1503,as ks1504,k04.ks0403,k19.ks1904,k19....