C中的qsort给出错误的结果

问题描述

我正在尝试对结构数组(SJF Scheduler)进行排序。我正在使用qsort库函数根据属性bursttime以递增顺序对结构进行排序。但是,输出不正确。我已经检查了一些类似的问题,但是它们没有用。

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语言中的许多标准函数都使用基于零的索引,这使得其他任何事情都变得毫无意义。与浪费一个数组位置相比,这是一个更大的问题。但是,无论好坏,我不得不将Fortran的大量代码转换为C,因此我已经习惯了两种方式。