c++ - 为什么快速排序在重复元素多的情况下效率低下?

标签 c++ sorting quicksort

当我对一些有很多重复元素的数据进行排序时,快速排序算法效率低下。谁能解释为什么?
这是我的快速排序代码:

int partition(int arr[],int low,int high)
{
    int i = low + 1;
    int j = high;
    int tmp = arr[low];
    while(1)
    {
        while(j != low && arr[j] > tmp) --j;   //from right to left
        while(i != high && arr[i] <= tmp) ++i;  //from left to right
        if(i < j)
        {
            int t = arr[j];
            arr[j] = arr[i];
            arr[i] = t;
        }
        else
            break;
    }
    return j;
}

void QuickSort(int arr[],int low,int high)
{
    if(low < high)
    {
        int j = partition(arr,low,high);
        int t = arr[j];
        arr[j] = arr[low];
        arr[low] = t;
        if(low < j)
            QuickSort(arr,low,j-1);
        if(high > j)
            QuickSort(arr,j+1,high);
    }
}

最佳答案

我的通灵调试技巧告诉我,不仅您的输入有很多重复项,而且重复元素是连续的,这使得输入大部分以排序开头。大部分排序的容器是快速排序的最坏情况,性能下降到 O(n^2)

对于大多数有序输入,其他排序(如堆排序和归并排序)将提供更好的性能,因为它们的最坏情况只是比它们的平均情况更高的常量。

关于c++ - 为什么快速排序在重复元素多的情况下效率低下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33771144/

相关文章:

c++ - 如何防止数组在传递给函数时被解释为指向第一个元素的指针?

javascript - 使用数组对对象进行排序并将值存储在另一个数组中

python - 对数组的各个列进行排序

Python:中位数为三的快速排序

c++ - 如何比较输入与 ASCII 码?

时间:2018-01-08 标签:c++mfc: update HWND through a control box

mysql排序顺序,需要稍微不同的结果

c - C 中的快速排序链接列表

c# - 这是快速排序吗?

c++ - 使用 SFML 和 Qt 窗口不显示