C 中的 qsort 给出错误的结果
qsort in C give wrong results
我正在尝试对结构数组(SJF 调度程序)进行排序。我正在使用 qsort 库函数根据属性 bursttime
以升序对结构进行排序。但是,输出不正确。我已经检查了一些关于相同的 SO 问题,但它们没有用。
struct job
{
int jobno;
int bursttime;
};
typedef struct job job_t;
int mycompare(const void* first, const void* second)
{
int fb = ((job_t*)first)->bursttime;
int sb = ((job_t*)second)->bursttime;
return (fb - sb);
}
int main()
{
int n;
printf("Enter number of jobs: ");
scanf("%d", &n);
job_t* arr = (job_t*)malloc(sizeof(job_t) * n);
for(int i = 1; i <= n; ++i)
{
printf("Enter Burst time for Job#%d: ",i);
scanf("%d", &(arr[i].bursttime));
arr[i].jobno = i;
}
printf("\n");
printf("Order of the Jobs before sort:\n");
for(int i = 1; i <= n; ++i)
{
printf("%d\t", arr[i].jobno);
}
qsort(arr, n, sizeof(job_t), mycompare);
printf("\n");
printf("Order of the Jobs after sort:\n");
for(int i = 1; i <= n; ++i)
{
printf("%d\t", arr[i].jobno);
}
printf("\n");
printf("\n");
return 0;
}
这是我的输入文件:
4
7
2
9
4
我得到的输出是:
Order of the Jobs before sort:
1 2 3 4
Order of the Jobs after sort:
2 1 3 4
预期顺序应为:2,4,1,3。我错过了什么吗?
至少这个问题
for(int i = 1; i <= n; ++i) // bad
使用零基础索引。
for(int i = 0; i < n; ++i)
您可以将索引方案更改为从零开始,正如其他人所建议的那样,这当然是惯用的方法。
但是如果你想使用基于 1 的索引,你需要在数组中分配一个额外的位置(位置 0 永远不会被使用):
job_t* arr = (job_t*)malloc(sizeof(job_t) * (n + 1));
那么您需要从数组中的位置 1 开始排序:
qsort(&arr[1], n, sizeof(job_t), mycompare);
当然,您必须编写代码以从 1 开始索引——但您已经这样做了。
问题在于,C 语言中的许多标准函数都使用 zero-based 索引,因此做任何其他事情都没有表现力。这比浪费一个数组位置是一个更大的问题。但是,无论好坏,我不得不将一大堆 Fortran 代码转换为 C,所以我已经习惯了两种方式。
我正在尝试对结构数组(SJF 调度程序)进行排序。我正在使用 qsort 库函数根据属性 bursttime
以升序对结构进行排序。但是,输出不正确。我已经检查了一些关于相同的 SO 问题,但它们没有用。
struct job
{
int jobno;
int bursttime;
};
typedef struct job job_t;
int mycompare(const void* first, const void* second)
{
int fb = ((job_t*)first)->bursttime;
int sb = ((job_t*)second)->bursttime;
return (fb - sb);
}
int main()
{
int n;
printf("Enter number of jobs: ");
scanf("%d", &n);
job_t* arr = (job_t*)malloc(sizeof(job_t) * n);
for(int i = 1; i <= n; ++i)
{
printf("Enter Burst time for Job#%d: ",i);
scanf("%d", &(arr[i].bursttime));
arr[i].jobno = i;
}
printf("\n");
printf("Order of the Jobs before sort:\n");
for(int i = 1; i <= n; ++i)
{
printf("%d\t", arr[i].jobno);
}
qsort(arr, n, sizeof(job_t), mycompare);
printf("\n");
printf("Order of the Jobs after sort:\n");
for(int i = 1; i <= n; ++i)
{
printf("%d\t", arr[i].jobno);
}
printf("\n");
printf("\n");
return 0;
}
这是我的输入文件:
4
7
2
9
4
我得到的输出是:
Order of the Jobs before sort:
1 2 3 4
Order of the Jobs after sort:
2 1 3 4
预期顺序应为:2,4,1,3。我错过了什么吗?
至少这个问题
for(int i = 1; i <= n; ++i) // bad
使用零基础索引。
for(int i = 0; i < n; ++i)
您可以将索引方案更改为从零开始,正如其他人所建议的那样,这当然是惯用的方法。
但是如果你想使用基于 1 的索引,你需要在数组中分配一个额外的位置(位置 0 永远不会被使用):
job_t* arr = (job_t*)malloc(sizeof(job_t) * (n + 1));
那么您需要从数组中的位置 1 开始排序:
qsort(&arr[1], n, sizeof(job_t), mycompare);
当然,您必须编写代码以从 1 开始索引——但您已经这样做了。
问题在于,C 语言中的许多标准函数都使用 zero-based 索引,因此做任何其他事情都没有表现力。这比浪费一个数组位置是一个更大的问题。但是,无论好坏,我不得不将一大堆 Fortran 代码转换为 C,所以我已经习惯了两种方式。