我想解决排序算法问题
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;
}
最终是否匹配您的真实输入数据完全是另一回事。我怀疑它不会,因为日期通常有斜杠、破折号等。您可能不得不花一些时间对输入值进行实际数据解析。但至少现在分拣部分已经处理好了。
首先我输入列表大小变量是 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;
}
最终是否匹配您的真实输入数据完全是另一回事。我怀疑它不会,因为日期通常有斜杠、破折号等。您可能不得不花一些时间对输入值进行实际数据解析。但至少现在分拣部分已经处理好了。