选择排序结构

时间:2015-12-02 19:18:23

标签: c++ c sorting struct

我对使用结构数组的选择排序的逻辑存在问题。比如说这是我的结构:

struct data {
    int month
    int day
    ..
    .. }

现在我要做的就是对月份和日期进行排序。我相信我知道这几个月如何做到这一点,但我很难理解如何实现这几天。这是我目前为止几个月的代码:

void sortData(struct Data yearData[], int sz)
    int i, j, m;
    int temp;

    for (i = 0; i < sz; i++) {
        m = i;
        for (j = i + 1; j < sz; j++)
            if (yearData[j].month < yearData[m].month) {
                m = j;
             }

        if (m != i) {
            temp = yearData[i].month;
            yearData[i].month = yearData[m].month;
            yearData[m].month = temp;
        }
    }
}

我想我想查看月份是否相同,然后查看日期并对它们进行排序。我只是不知道在这种情况下添加另一个迭代是否正确。谢谢!

2 个答案:

答案 0 :(得分:1)

试试这个:

...
if((yearData[j].month < yearData[m].month) || 
   ((yearData[j].month == yearData[m].month) && 
    (yearData[j].day < yearData[m].day))) {
    m = j;
}
...

但是,我不确定我理解你的交换。你应该逐个交换整个结构,而不是它的成员。考虑一下:

if (m != i) {
  struct Data tmp = yearData[i];
  yearData[i] = yearData[m];
  yearData[m] = tmp;
}

答案 1 :(得分:0)

制作比较功能,然后使用其结果。如果结构相等,比较函数应该返回0,如果左边应该是第一个,则返回-1,如果右边应该第一个,则返回+1。

它看起来像:

int yearDataCmp(struct Data left, struct Data right) {
    if ( left.month < right.month ) { return -1; }
    if ( left.month > right.month ) { return  1; }
    if ( left.day   < right.day   ) { return -1; }
    if ( left.day   > right.day   ) { return  1; }
    return 0;
}