快速排序的思想是:
1)初始輸入值是一串亂序的數字s=
2)選取某個邏輯位置的值為「中間值」(m),然後經過用s中的其他元素跟m比較:比m大的元素都調整到在「中間值」之前,其餘的放置在「中間值」之後
-->現在,序列成了「準排序」狀態,s被調整為s',分為三個部分p= ,m=, q= ,而這三個部分有p>m>q的關係(p內任意元素》=m>=q內任意元素)只不過在p,q的內部還是亂序狀態, 於是,我們如果將p,q再進行排序,最後就能得到排序結果,而對p,q的排序,我們可以遞迴呼叫快速排序演算法
3)對p, q分別遞迴呼叫快速排序演算法進行排序,生成內部排序的p'和q'.
-->遞迴的終止條件,就是某子串行內只有2個數,於是可以在一次比較(及必要的互換)之後,返回排序序列
4)返回p' + m + q'
在第二步中,我們進行了n次比較,不過通過每次呼叫,都能達到將序列一分為二的目的,所以,分割的速度是指數增長的。一般認為快速排序的演算法複雜度為n log(n);不過它是不穩定演算法,最糟糕的情形仍然會達到n^2,這種最差情形,竟然是出在已排序序列上的。 對於一般的隨機亂序而言,快速排序可以比較穩定的用 n*logn的時間複雜度完成。
還需要說明一下的是,具體實現快排演算法時,注意利用陣列位置的交換,而不用新引入其他陣列作為儲存空間。
好了,貼上乙個本人的實現
1. 以隊尾元素做中間值m,
2. 從1 到 n-1 掃瞄序列,比m大的元素不動(屬於p),其餘的跟q序列倒數字置的元素交換,再繼續比對;於是乎,p序列從頭生成,q序列從隊尾(n-1處)逆向生成,當p,q的指標相遇時,步驟2)完成
3. 遞迴p, q; 返回p, m , q
快拍實戰非常強大,比如,某次在相同條件下開展benchmark,隨機生成10,000個正整數進行排序,冒泡需要77ms, 快排序要0ms;
對於20,000個, 冒泡145 ms, 快排需要1ms. (由於n=20,000, logn=4*(1+.318), 而0.5n/logn=2000;實際上沒有2000倍這麼誇張了,是因為快排有很多對調的操作要佔一些時間,但是快百倍還是有的,另外, n越大,二者效率相差的倍數就更大)。
排序演算法 快速排序原理及Java實現
和以前的寫法對比,基準值所在的位置沒必要每次都進行交換,只在一次快排完成後,重新把當前的基準值賦值給現在的index位置就好了。寫的很強,感謝作者 public class quicksort i low j hight index a i 用子表的第乙個記錄做基準 while i j a i in...
快速排序原理及C 實現
原理 快速排序,說白了就是給基準資料找其正確索引位置的過程.如下圖所示,假設最開始的基準資料為陣列第乙個元素23,則首先用乙個臨時變數去儲存基準資料,即tmp 23 然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌 low指向起始位置,high指向末尾.首先從後半部分開始,如果掃瞄到的值大於基準資料就讓...
C 快速排序集合
c 實現集合排序類。說明 1 集合型別引數化 2 可根據集合中的物件的各個屬性進行排序,傳入屬性名稱即可 注 屬性必須實現了icomparable介面,c 中int datetime string等基本型別都已經實現了icomparable介面。對集合進行排序,如 listusers new lis...