java - 快速排序。如何选择枢轴元素?

标签 java algorithm language-agnostic quicksort

我阅读了快速排序算法,但我不明白如何选择主元。从教程中我得到了 quciksort 的示例代码:

public void quicksort(int[] A, int left, int right) {
    int pivot = A[left + (right - left) / 2];
    int i = left;
    int j = right;
    while (i <= j) {
        while (A[i] < pivot) {
            i++;
        }
        while (A[j] > pivot) {
            j--;
        }
        if (i <= j) {
            exchange(i, j);
            i++;
            j--;
        }
    }

    if(left < j)
        quicksort(A,left,j);
    if(i < right)
        quicksort(A,i,right);
}

但为什么我们选择使用这个 A[left + (right - left)/2]; 的枢轴?

为什么不是 A[(right - left)/2]

最佳答案

考虑 left=6, right=10,然后 (right-left)/2 是 2。您选择的元素不在您的范围内子数组?

您可以选择 6 到 10 之间的任何元素作为快速排序。但是如果您选择第一个或最后一个元素并且如果数组已排序,那么您的算法可能会运行 O(n^2) 时间。所以选择中间元素总是更好。

关于java - 快速排序。如何选择枢轴元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17442139/

相关文章:

algorithm - 查找是否可以从字符矩阵中获取字符串

java - java中的异步和非阻塞概念。有没有可能异步和阻塞在一起?

java - 如何在android中启动和停止进度条?

google-app-engine - 在 Mac 上使用 App Engine 时出现问题 Java JRE

java - 我什么时候需要在 Java 中使用 AtomicBoolean?

java - 改进以更快的方式分解的代码?

java - 将设置存储在数据库中

java - HBase - 带偏移量的值过滤器?

sql - 将平面表解析为树的最有效/优雅的方法是什么?

java - 生成小于 n 的 k 个不同的数字