我想解决排序算法问题

I want to solve the sorting algorithm problem

首先我输入列表大小变量是 n 并得到 n 个日期数据输入日、月、年。

我想使用结构制作日期数组。

并且我想在 c

中使用 qsort 对日期数据进行排序

例如) 20, 1, 2014 / 25, 3, 2010 / 3, 12, 1676 / 18, 11, 1982 / 19, 4, 2015 / 9, 7, 2015

->

3, 12, 1676 / 18, 11, 1982 / 25, 3, 2010/ 20, 1, 2014/ 19, 4, 2015 / 9, 7, 2015

但不知为何无法解决

我想听听一些评论。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct date{
    int day;
    int month;
    int year;
}date;

bool compare(const date *d1, const date *d2){
    if(d1->year < d2->year){
        return true;
    }
    if (d1->year == d2->year && d1->month < d2->month){
        return true;
    }
    if (d1->year == d2->year && d1->month == d2->month && d1->day < d2->day){
        return true;
    }
    else {
        return false;
    }
}

int main(void){
    int n;
    int i;
    scanf("%d",&n);
    date data[n];
    for(i=0;i<n;i++){
        scanf("%d %d %d", &data[i].day, &data[i].month, &data[i].year);
    }
    qsort(data, n, sizeof(data)/sizeof(date) ,compare);

    for(i=0;i<n;i++){
        printf("%d %d %d \n",data[i].day,data[i].month,data[i].year);
    }
    
    return 0;
}

您的 qsort 比较器是错误的。标准库函数期望一个函数接受两个 const void * 参数并返回一个 int 值,在确定两个项目的关系时表示负(小于)、零(等价)或正(大于)比较的。此外,您对 qsort 的第三个参数也是错误的。它是正在排序的序列中 一个 项目(单数)的大小,而不是项目的数量(您已经将其作为第二个参数提供)。

修复这些问题并验证输入(不要假设任何事情),结果是:

#include <stdio.h>
#include <stdlib.h>

typedef struct date
{
    int day;
    int month;
    int year;
} date;

int compare(const void *arg1, const void * arg2)
{
    const date *d1 = arg1;
    const date *d2 = arg2;

    int res = (d1->year < d2->year) ? -1 : (d2->year < d1->year);
    
    if (res == 0)
    {
        res = (d1->month < d2->month) ? -1 : (d2->month < d1->month);
    }

    if (res == 0)
    {
        res = (d1->day < d2->day) ? -1 : (d2->day < d1->day);
    }

    return res;
}

int main(void)
{
    int n;
    if (scanf("%d", &n) == 1 && n > 0)
    {
        date data[n];
        int i = 0;
        for (; i < n; ++i)
        {
            if (scanf("%d %d %d", &data[i].day, &data[i].month, &data[i].year) != 3)
                break;
        }

        if (i > 0)
        {
            n = i;
            qsort(data, n, sizeof *data, compare);
            for (i = 0; i < n; i++)
            {
                printf("%d %d %d \n", data[i].day, data[i].month, data[i].year);
            }
        }
    }

    return 0;
}

最终是否匹配您的真实输入数据完全是另一回事。我怀疑它不会,因为日期通常有斜杠、破折号等。您可能不得不花一些时间对输入值进行实际数据解析。但至少现在分拣部分已经处理好了。