使用 qsort 对结构指针数组进行排序 [英] Sorting an array of struct pointers using qsort
问题描述
我尝试在这个结构数组上使用 qsort 得到了奇怪的结果.
I'm getting weird results from trying to use qsort on this array of structs.
我有这个结构:
struct access_data{
int sector;
int arrival_time;
int checked;
int processed;
};
我从文件中构造了一个 access_data 指针数组,以便它们按到达时间排序,但稍后我需要按扇区对它们进行排序,因此我有以下内容:
I construct an array of access_data pointers from a file such that they are sorted by arrival_time, but I need to sort them by sector later, so I have the following:
int compare_data(const void* a, const void* b){
if (((access_data*)a)->sector < ((access_data*)b)->sector)
return 1;
else if (((access_data*)a)->sector > ((access_data*)b)->sector)
return -1;
else
return 0;
}
void scan(access_data* data[], int len, int sec_to_sec_seek){
qsort(data, len, sizeof(access_data*), &compare_data);
show_data(data, len);
}
show_data 只是打印数据,但我在示例输入中得到以下信息;再次,已经按到达时间排序:
show_data simply prints the data, but I get the following on a sample input; again, sorted already by arrival time:
data[0]: arrival_time: 7, sector: 3
data[1]: arrival_time: 6, sector: 8
data[2]: arrival_time: 5, sector: 6
data[3]: arrival_time: 4, sector: 5
data[4]: arrival_time: 3, sector: 12
data[5]: arrival_time: 2, sector: 10
data[6]: arrival_time: 1, sector: 1
data[7]: arrival_time: 0, sector: 2
它根本不是按扇区排序,而是按反向到达时间排序.我真的完全不知道是什么导致了这种行为.
It is simply not sorting by sector, but by reverse arrival time. I'm really at a complete loss at to what could be causing this behavior.
推荐答案
您的代码表明您实际上是在尝试对指向 struct 的指针数组进行排序.
在这种情况下,您缺少一个间接级别.你的方向也被颠倒了.
In this case you are missing a level of indirection. You also have your directions reversed.
您的 compare_data 例程适用于对结构数组进行反向排序,但您希望根据指针指向的内容对指针数组进行排序.
Your compare_data routine would be fine for reverse sorting an array of structs, but you wish to sort an array of pointers based on what they point to.
int compare_pointed_to_data(const void* a, const void* b) {
// a is a pointer into the array of pointers
struct access_data *ptr_to_left_struct = *(access_data**)a;
struct access_data *ptr_to_right_struct = *(access_data**)b;
if ( ptr_to_left_struct->sector < ptr_to_right_struct->sector)
return -1;
else if (ptr_to_left_struct->sector > ptr_to_right_struct->sector)
return 1;
else
return 0;
}
这篇关于使用 qsort 对结构指针数组进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!