使用C中的快速排序反向排序(降序)?

Posted

技术标签:

【中文标题】使用C中的快速排序反向排序(降序)?【英文标题】:Using Quick Sort in C to sort in reverse direction (descending)? 【发布时间】:2011-12-28 06:34:50 【问题描述】:

为了排序,我打电话给qsort(myArray,100,sizeof(int), comp)

int comp(const int * a, const int * b)
if(a==b)

    return 0;

else

    if(a<b)
    
        return -1;
    
    else
    
        return 1;
    

首先, 这实际上不起作用,当我对数组(9,8,7,6,5,4,3,2,1,1), 进行排序时,我得到(4,8,7,6,5,9,3,2,1) - 没有真正排序。

第二, 我将如何在另一个方向排序?我需要通过 qsort 的特殊标志吗?

【问题讨论】:

【参考方案1】:

您需要比较这些值,而不是它们的地址。试试

int comp(const int * a, const int * b)

 return *a - *b;

要颠倒排序,请使用

int comp(const int * a, const int * b)

 return *b - *a;

【讨论】:

您不应该将减法用作比较的“捷径”,因为当值相距足够远时(例如,将 INT_MAX 与 -1 进行比较等),它很容易上溢/下溢。 如果你想要一个花哨的单行比较工作,你可以做return (*a &gt; *b) - (*b &gt; *a); @caf:我认为return (*a &gt; *b) ? 1 : ((*a &lt; *b) ? -1 : 0); 会更安全,因为您不必依赖返回的任何int 值来进行比较。 @bobbymcr:比较运算符总是返回10 @caf:我明白了……你是对的,标准是这样说的。 (C99 标准,6.5.8.6)【参考方案2】:

更改您的比较功能,使其按您喜欢的方式排序。

比较函数采用指向比较数据的指针(而不是数据本身)。例如。

int compare (const void* p1, const void* p2)
 
   int i1 = *(int*) p1;
   int i2 = *(int*) p2;
   if (i1 < i2) return -1;
   else if (i1 == i2) return 0;
   else return 1;
   /* or simply: return i1 - i2; */
 

【讨论】:

什么意思?你有一个实际工作的比较函数的例子吗?我不确定如何设置比较功能?我也认为我的工作,但它返回的数组...比原来的顺序少哈哈 你测试了我的比较功能吗?我很确定它应该可以工作。阅读更多然后是 qsort 的手册页。 linux.die.net/man/3/qsort 我仍然得到相同的排序 4,8,7,6,5,9,3,2,1,1 可能是我称呼它的方式? qsort(ar,10,sizeof(int),comp)【参考方案3】:

你的比较器坏了。您正在比较指针值而不是指向的值。将* 取消引用运算符添加到ab 比较中,它应该可以工作。

【讨论】:

以上是关于使用C中的快速排序反向排序(降序)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Game Maker Studio 2 中的快速排序算法对列表进行排序

php之快速入门学习-11(数组排序)

经典排序之冒泡排序和快速排序

C++ 快速排序枢轴优化

七大排序之:冒泡排序和快速排序

算法1 排序算法:冒泡排序和快速排序