【发布时间】:2014-09-05 14:35:29
【问题描述】:
我正在尝试实现自定义快速排序和自定义比较器,因为我需要按两个元素对结构进行排序(如果第一个元素相等,则按第二个元素排序)。
我使用了以下代码,该代码最初发布在以下第一个答案中: Sorting an array using multiple sort criteria (QuickSort)
typedef struct player {
int total;
char name[16];
} player;
void swap(player *p1,player *p2) {
player tmp = *p2;
*p2 = *p1;
*p1 = tmp;
}
int comp(const player *p1,const player *p2) {
if (p1->total < p2->total) return 1;
if (p1->total > p2->total) return -1;
return strcmp(p1->name, p2->name);
}
static void quickSort(player *arr, int left, int right) {
int m = (left+right)/2;
int l = left, r = right;
while (l <= r) {
while (comp(arr+l, arr+m) < 0) l++;
while (comp(arr+r, arr+m) > 0) r--;
if (l <= r) {
swap(arr+l, arr+r);
l++; r--;
}
}
if (r > left) quickSort(arr, left, r);
if (l < right) quickSort(arr, l, right);
}
我无法让它工作。它会按总数排序成功,但当两个总数相等时,它会按名称排序失败。
是的,我尝试过将此比较器与标准 qsort 函数一起使用,并且效果很好。但使用它将是我最后的选择。
感谢任何帮助。
编辑:
我猜关键是问题所在。当我向它添加 1 时,“名称”排序工作正常,但一些“总”元素出现故障。
【问题讨论】:
-
你确定玩家的名字适合 16 字符数组并且在数组中以零字符正确终止吗?
-
BLUEPIXY 是什么意思? @CiaPan 我正在使用 scanf 从标准输入读取它们。我应该担心吗?它们上面没有空格或特殊字符,只有大写或小写字母
-
问题出在 quickSort 例程上,多亏了 ceferrari 对我(被我删除)答案的澄清,我可以验证如果调用 qsort 但不能使用他的 quickSort 例程,这确实有效。我最初认为问题出在比较函数上,因为它按 id 降序然后 name 升序排序,但 ceferrari 表示这是故意的。
-
评论太长了,所以我不得不把is作为答案。
标签: c sorting pointers quicksort comparator