【问题标题】:Using Quick Sort in C to sort in reverse direction (descending)?使用C中的快速排序反向排序(降序)?
【发布时间】: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 的特殊标志吗?

【问题讨论】:

    标签: c arrays sorting data-structures


    【解决方案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 比较中,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      相关资源
      最近更新 更多