什麼是3分區快速排序?3分區快速排除
3分區快速排除
回答
圖片數組:
3, 5, 2, 7, 6, 4, 2, 8, 8, 9, 0
一個兩個分隔快速排序將挑選一個值,即4,並把每一個元素大於4的陣列的一側而另一邊的每個元素小於4。像這樣:
3, 2, 0, 2, 4, | 8, 7, 8, 9, 6, 5
一個3分區快速排序就挑兩個值進行分區並分裂陣列了這種方式。讓我們選擇4和7:
3, 2, 0, 2, | 4, 6, 5, 7, | 8, 8, 9
這只是普通快速排序上的輕微變化。
您繼續對每個分區進行分區,直到對數組進行排序。 運行時在技術上是nlog (n),它與常規快速排序的記錄(n)之間的變化非常小。
http://www.sorting-algorithms.com/static/QuicksortIsOptimal.pdf
參見:
http://www.sorting-algorithms.com/quick-sort-3-way
我認爲面試問題的版本也非常有趣。它要求,are there four partition versions of quicksort ...
這似乎是正確的答案。 3種快速排序方式處理有很多重複鍵時的性能。 – 2012-09-19 22:15:22
如果您真的使用Akra-Bazzi formula將分區數作爲參數進行數學運算,然後對該參數進行優化,您會發現e(= 2.718 ...)分區提供了最快的性能。然而,在實踐中,我們的語言結構,cpus等都針對二進制操作進行了優化,因此標準分區到兩個集合將是最快的。
我在3路分區是由Djstrka。
想一想與元素的數組{3,9,4,1,2,3,15,17,25,17}
基本上設置了3個分區,小於,等於,和更大的比。分區樞軸,所有小於樞軸的元素,加上大於樞軸的所有元素。您移動所有等於主鍵的元素。
//code to implement Dijkstra 3-way partitioning
package Sorting;
public class QuickSortUsing3WayPartitioning {
private int[]original;
private int length;
private int lt;
private int gt;
public QuickSortUsing3WayPartitioning(int len){
length = len;
//original = new int[length];
original = {0,7,8,1,8,9,3,8,8,8,0,7,8,1,8,9,3,8,8,8};
}
public void swap(int a, int b){ //here indexes are passed
int temp = original[a];
original[a] = original[b];
original[b] = temp;
}
public int random(int start,int end){
return (start + (int)(Math.random()*(end-start+1)));
}
public void partition(int pivot, int start, int end){
swap(pivot,start); // swapping pivot and starting element in that subarray
int pivot_value = original[start];
lt = start;
gt = end;
int i = start;
while(i <= gt) {
if(original[i] < pivot_value) {
swap(lt, i);
lt++;
i++;
}
if(original[i] > pivot_value) {
swap(gt, i);
gt--;
}
if(original[i] == pivot_value)
i++;
}
}
public void Sort(int start, int end){
if(start < end) {
int pivot = random(start,end); // choose the index for pivot randomly
partition(pivot, start, end); // about index the array is partitioned
Sort(start, lt-1);
Sort(gt+1, end);
}
}
public void Sort(){
Sort(0,length-1);
}
public void disp(){
for(int i=0; i<length;++i){
System.out.print(original[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
QuickSortUsing3WayPartitioning qs = new QuickSortUsing3WayPartitioning(20);
qs.disp();
qs.Sort();
qs.disp();
}
}
我認爲這與Dijkstra分區方式有關,其中分區的元素小於,等於和大於主元。只有較小和較大的分區才能遞歸排序。您可以在the walnut上看到交互式可視化效果。我使用的顏色有紅色/白色/藍色,因爲分區的方法通常稱爲「荷蘭國旗問題」
- 1. Python 3路分區(快速排序)
- 2. 快速排序3路分區太慢
- 3. Lomuto分區快速排序
- 4. 快速排序:分區分析
- 5. 實現3元素分區的快速排序算法,
- 6. Java庫中的快速排序3路分區
- 7. 正確分區快速排序
- 8. 快速排序分區不編譯
- 9. 快速排序幫助 - 分區
- 10. 使用Coq快速排除
- 11. 基於排序的分區(類似於快速排序)
- 12. 快速排序+分析
- 13. 快速排序分析
- 14. 快速排序劃分
- 15. 如何在Node.js上編寫快速排序(Bentley-McIlroy 3-way分區方案)?
- 16. 3路快速排序(C實現)
- 17. 3路快速排序(C++)的STATUS_ACCESS_VIOLATION
- 18. 位數3快速排序執行
- 19. 3路快速排序,問題
- 20. 爲什麼QuickSort Single比3路分區快速轉換?
- 21. C隨機樞軸快速排序(改進分區功能)
- 22. 我需要使用快速排序算法的分區步驟
- 23. 這用什麼分區算法? (用於快速排序)
- 24. 第一個分區後快速排序不起作用
- 25. 快速排序通過豪爾分區在r
- 26. 快速排序分區爲什麼隨機數據樞軸?
- 27. 快速模3或除法算法?
- 28. jQTouch的iPhone - 快速排除故障?
- 29. Swift 3:快速文件路徑分離
- 30. 桶分類與快速排序
+1爲簡明扼要。 – cgp 2009-06-02 19:42:58
謝謝! – jjnguy 2009-06-02 19:44:04
現在有趣的問題是:「在什麼情況下,n路QS比m路QS更好?」 – dmckee 2009-06-02 20:36:24