2011-11-13 115 views
3

排序我打电话qsort(myArray,100,sizeof(int), comp)使用快速排序C进行反向排序(降序)?

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标志吗?

回答

7

更改您的比较功能,以便按照您喜欢的方式进行订购。

而比较函数需要指向比较数据(而不是数据本身)。例如。

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; */ 
} 
+0

你是什么意思?你有一个比较功能的例子,实际上有效吗?我不确定如何设置比较功能?另外我还以为我的工作,但它返回一个数组...比原来的订单少# –

+0

你测试我的比较功能吗?我很确定它应该起作用。阅读更多,然后阅读qsort的手册页。 http://linux.die.net/man/3/qsort –

+0

我仍然得到相同的顺序4,8,7,6,5,9,3,2,1,1 –

6

您需要比较的值,而不是他们的地址。尝试

int comp(const int * a, const int * b) 
{ 
return *a - *b; 
} 

要反向排序,使用

int comp(const int * a, const int * b) 
{ 
return *b - *a; 
} 
+1

您不应该使用减法作为比较的“快捷方式”,因为当这些值相隔很远时(例如,将INT_MAX与-1等比较),它将很容易发生上溢/下溢。 – bobbymcr

+0

@bobbymcr,当然你是对的。 – lhf

+1

如果你想要一个花哨的单线比较*作品*,你可以做'return(* a> * b) - (* b> * a);' – caf

2

你比较坏。您正在比较指针值而不是指向的值。将*解除引用运算符添加到ab比较,它应该工作。