快速排序的这种特定实现的最佳,平均和最差情况是什么?

时间:2015-11-07 16:19:30

标签: java algorithm sorting quicksort

我知道最佳和平均时间是O(n log(n)),最差时间是O(n ^ 2)。在这个特定的实现中,这些案例何时实际发生时,谁能告诉我?它在其他实现中有何不同?

    private void quickSort(int low, int high) {
        int i = low, j = high;
        // Get the pivot element from the middle of the list
        int pivot = array[low + (high - low) / 2];

        // Divide into two lists
        while (i <= j) {
            // If the current value from the left list is smaller then the pivot
            // element then get the next element from the left list
            while (array[i] < pivot) {
                i++;
            }
            // If the current value from the right list is larger then the pivot
            // element then get the next element from the right list
            while (array[j] > pivot) {
                j--;
            }

            // If we have found a values in the left list which is larger then
            // the pivot element and if we have found a value in the right list
            // which is smaller then the pivot element then we exchange the
            // values.
            // As we are done we can increase i and j
            if (i <= j) {
                swap(array, i, j);
                i++;
                j--;
            }
        }
        // Recursion
        if (low < j)
            quickSort(low, j);
        if (i < high)
            quickSort(i, high);
    }

任何反馈都非常感谢。

1 个答案:

答案 0 :(得分:0)

最糟糕的情况发生在您选择一个枢轴时,在“划分为两个列表”部分之后,最终会出现在阵列的一个极端(最左侧或最右侧)。原因是:两个递归调用中的一个将完成几乎没有工作,而另一个将几乎完成所有工作

例如:您对1到100之间的数字进行排列,并在中间选择一个数据透视表。假设枢轴为1.您运行“划分为两个列表”部分,现在您必须对左侧的0个元素和右侧的99个元素进行排序。

最好的情况是当枢轴分成两个列表的一半时(在排列示例中,当你选择一个大约50的枢轴时)。