使用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 > *b) - (*b > *a);
@caf:我认为return (*a > *b) ? 1 : ((*a < *b) ? -1 : 0);
会更安全,因为您不必依赖返回的任何int
值来进行比较。
@bobbymcr:比较运算符总是返回1
或0
。
@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】:你的比较器坏了。您正在比较指针值而不是指向的值。将*
取消引用运算符添加到a
和b
比较中,它应该可以工作。
【讨论】:
以上是关于使用C中的快速排序反向排序(降序)?的主要内容,如果未能解决你的问题,请参考以下文章