C - 按年数排序一年的数据

时间:2015-12-08 00:53:59

标签: c algorithm sorting

我试图将一年的记录分为几个月,然后是一个月中的几天(1-28 / 29/30/31)。我按月分类。

struct DailyData {
    int day;
    int month;
    int year;
    float high;
    float low;
    float precipitation;
    char condition;
};

void sortYearData(struct DailyData yearData[], int sizeOfArray){

    int i,j;
    struct DailyData climate;


    for (i = sizeOfArray - 1; i > 0; i--) {
        for (j = 0; j < i; j++) {
            if (yearData[j].month > yearData[j+1].month) {
                climate = yearData[j];
                yearData[j] = yearData[j+1];
                yearData[j+1] = climate;
            }
        }
    }
}

我正在试图弄清楚如何对这个月内的日子进行排序。

任何帮助或建议都会很棒。

谢谢

2 个答案:

答案 0 :(得分:4)

无需编写自己的排序算法。

首先,编写一个比较两个项目的比较器,如下所示:

int data_comparer(void const *x, void const *y) {
    DailyData const *X = x, *Y = y;
    return  X->month != Y->month ? (X->month > Y->month) - (X->month < Y->month)
                                 : (X->day   > Y->day)   - (X->day   < Y->day);
}

然后你可以像qsort一样使用它:

void sortYearData(struct DailyData yearData[], size_t sizeOfArray){
    qsort(yearData, sizeOfArray, sizeof *yearData, data_comparer);
}

作为警告,您可以对bsearch使用相同的比较器:

struct DailyData *search(struct DailyData yearData[], size_t sizeOfArray, struct DailyData *search_query) {
    return bsearch(search_query, yearData, sizeOfArray, sizeof *yearData, data_comparer);
}

答案 1 :(得分:3)

你不能把你的if条件改为:

if ((yearData[j].month > yearData[j+1].month) || 
    ((yearData[j].month == yearData[j+1].month) &&
     (yearData[j].day > yearData[j+1].day)))
{