【问题标题】:Is there any bad code? ( Quick sorting time complexity on C )有什么不好的代码吗? (C 上的快速排序时间复杂度)
【发布时间】:2017-09-21 16:19:44
【问题描述】:
void QuickSort(int* x, int first, int last) {
    if (first >= last)
        ;
    else {
        int pivotindex = Partition(x, first, last);

        QuickSort(x, first, pivotindex - 1);
        QuickSort(x, pivotindex + 1, last); 
    }
}

int Partition(int* x, int first, int last) {
    int isbig = first + 1, issmall = last, tmp;

    while (1) {
        while (x[isbig++] < x[first] && isbig != last + 1);     // 

        while (x[issmall--] > x[first] && issmall != first);    // 

        if (isbig < issmall) {  //          tmp = x[issmall];
            x[issmall] = x[isbig];
            x[isbig] = tmp;
        }
        else {  //          tmp = x[first];
            x[first] = x[issmall]; 
            x[issmall] = tmp;

            break;  // 
        }
    }

    return issmall; //
}

我对这段代码有疑问。我自己编码。 它正在工作。但是这件事比我做的归并排序算法要慢。 我找不到问题所在。 (我知道归并排序和快速排序的时间复杂度在非排序数据上是相等的,但在 10,000 个数据排序上:time comparison ignore korean

它比归并排序大 10 倍。我认为这意味着代码很糟糕。 但我找不到它在哪里。 代码中是否有任何不好的部分导致时间复杂度变大?

【问题讨论】:

  • 您似乎已经注释掉了两个关键行? (或者是代码格式错误?)
  • 代码使用tmp,但从不设置它。
  • 大家感谢您回答我的问题。我找到原因了。 Actully 我是排序排序arry。但我认为这是非排序的。这意味着结果时间是最坏情况时间。

标签: c sorting merge


【解决方案1】:

在最坏的情况下,快速排序是O(n^2),您在这里看到。发生这种情况是因为您使用数组的第一个元素作为枢轴并对已排序的数据进行排序,因此数组被分为一个元素和 n-1 个元素。

为了比较,mergesort 总是O(n log n)

您可以使用x[(first + last) / 2] 作为基准,而不是使用x[first]

见:https://en.wikipedia.org/wiki/Quicksort#Choice_of_pivot

【讨论】:

  • 使用中间元素不会给排序数据带来 n^2 的复杂性,这是一种常见的情况。有可能恶意构建一个案例,该案例将为任何非随机选择的枢轴提供 n^2 复杂度
  • 好吧,我已经删除了我的评论,也许我不应该这样做。但是为什么对排序数据使用排序功能是一种常见的情况呢?我想说的恰恰相反。
  • 一切顺利。我想你是对的,这真的取决于用例
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多