什么是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. 快速排序3路分区太慢
- 2. Python 3路分区(快速排序)
- 3. 快速排序:分区分析
- 4. 实现3元素分区的快速排序算法,
- 5. Java库中的快速排序3路分区
- 6. 快速排序分区不编译
- 7. 使用Coq快速排除
- 8. 快速排序+分析
- 9. 快速排序分析
- 10. 快速排序划分
- 11. 3路快速排序(C实现)
- 12. 3路快速排序,问题
- 13. 位数3快速排序执行
- 14. 快速排序通过豪尔分区在r
- 15. 我需要使用快速排序算法的分区步骤
- 16. 快速排序分区为什么随机数据枢轴?
- 17. 快速模3或除法算法?
- 18. Swift 3:快速文件路径分离
- 19. 快速排序分析和行为
- 20. 快速排序分而治之
- 21. 桶分类与快速排序
- 22. 快速排序不排序
- 23. 快速排序(JAVA)
- 24. 的快速排序
- 25. 的快速排序
- 26. 并行快速排序由单线程快速排序
- 27. 快速删除plist
- 28. 计算3×3对称矩阵谱分解的快速方法
- 29. Rails 3&MailChimp - 加快速度
- 30. 位置快速问题3
+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