我在排序包含3个infos
类型的结构数组时遇到了麻烦。我想订购其中一个信息,然后组织其他2个信息,但我正在使用heapsort,不知道如何更改代码以自动重组。有什么逻辑提示可以帮助我吗?这是结构
typedef struct{
int orig;
int dest;
float cost;
}infos;
感谢。我可以添加任何有助于人们帮助我的信息!
[编辑]
void build ( Armaz x[], int n ){
int i;
float val;
int s;
int f;
for (i = 1; i<n; i++){
val = x[i].cost;
s = i;
f = (s-1)/2;
while (s>0 && x[f].cost<val){
x[s].cost = x[f].cost;
s = f;
f = (s-1) / 2;
}
x[s].cost = val;
}
}
void heapsort (infos x[], int n){
build(x,n);
int i;
int s;
int f;
float vali ;
for (i = n - 1 ; i > 0 ; i--){
vali = x[i].cost;
x[i].cost = x[0].cost;
f = 0 ;
if (i == 1){
s = -1;
}
else s = 1;
if ( i > 2 && x[2].cost > x[1].cost) s = 2 ;
while ( s >= 0 && vali < x[s].cost){
x[f].cost = x[s].cost;
f = s;
s = 2 * f + 1;
if ( s + 1 <= i - 1 && x[s].cost < x[s + 1].cost ) s++;
if (s > i-1) s = -1;
}
x[f].cost = vali;
}
}
答案 0 :(得分:1)
即使您实施自己的排序功能,我建议您仔细查看the standard qsort
function的工作原理。
简而言之:它有一个参数,它是一个指向用于比较的函数的指针。该函数接收指向应该比较的两个“对象”的指针,并且可以做任何想要比较两个“对象”的东西。这意味着可以有三个不同的比较函数,一个用于结构的每个成员,并在需要时传递适当的一个。