【问题标题】:Make qsort stable just by modifying comparison? [duplicate]仅通过修改比较使 qsort 稳定? [复制]
【发布时间】:2012-04-23 20:15:11
【问题描述】:

可能重复:
Stabilizing the standard library qsort?

是否可以仅通过修改我的 comp op 来使整数的 qsort 稳定?那是我的代码。我在大约 5-7 大小的非常小的数组上使用它。

static int compare( const void *a, const void *b )
{
    const int A(*(const int*)(a));
    const int B(*(const int*)(b));

    return B - A;
}

【问题讨论】:

  • 如果您的ints 的大小“合理”并且不会发生溢出 - 是的。
  • @valdo:你确定你理解了这个问题吗?您认为 C 标准库函数 qsort() 是稳定排序吗?有任何参考吗?
  • 当您的数据只是普通整数时,为什么还要关心排序算法是否稳定?仅当您有可区分的元素进行比较时,稳定性才重要。
  • 答案是“不”。我会将其发布为答案而不是评论,但我什至无法想象你怎么可能认为这可能有效,所以我不确定我需要解释什么来说服你它没有。

标签: c++ c sorting qsort stable-sort


【解决方案1】:

如果您使用的是 C++,stable_sort 函数是稳定的并且具有 O(nlogn) 性能。

否则,就地快速排序本质上是不稳定的(我相信如此)。然而,使用额外数组存储信息的简单变体是稳定的。

我至少使用过一个不稳定的qsort() 版本,因为一旦我发现qsort()stable_sort() 在我的机器上为输入案例生成的结果不同。

【讨论】:

    【解决方案2】:

    你不能仅仅通过改变比较运算符来使不稳定的排序算法(如快速排序)变得稳定。您必须开始使用稳定的排序算法,然后比较无关紧要(只要它是 C++ 中严格的弱排序)。

    【讨论】:

    • 您可以在不稳定排序的基础上构建稳定排序,方法是构造指向原始元素的指针数组,然后对指针数组进行排序,通过指针比较打破平局。
    【解决方案3】:

    如果您要排序的数组真的很小,那么您最好使用另一种排序算法。参见例如答案:Fast stable sort for small arrays (under 32 or 64 elements)Fast algorithm implementation to sort very small list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-05
      • 2020-07-19
      • 2014-10-10
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多