2015-12-02 84 views
0

我遇到了一個問題,圍繞使用結構數組選擇排序的邏輯。例如說這是我的結構:結構的選擇排序

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; 

    } 
    } 
} 

我覺得我要檢查,看看是否月份相同,則看天,他們排序爲好。我只是不知道在這種情況下再添加一個迭代是否正確。謝謝!

+0

作爲一個供參考:C!= C++,你通常應該只標記你正在編寫/編譯的語言(答案可能差別很大)。 – crashmstr

+0

爲什麼你不使用std :: sort的任何特定原因? – StahlRat

回答

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; 
} 
+0

我不相信我可以爲此做出另一個功能。它必須在void sortData(struct Data yearData [],int sz)函數中。 – bp131313

+0

不夠公平。只需在主函數中嵌入邏輯即可。創建一個'cmp'變量,默認爲'0',然後使用'yearDataCmp'函數中的'if'語句。而不是返回一個值,只需相應地執行'cmp = -1'或'cmp = 1'。 –

+0

謝謝你的幫助 – bp131313

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; 
} 
+0

ahhhh看起來像我想要它做的。我不交換整個結構的原因是因爲有更多的成員,而不僅僅是幾個月和幾天。 – bp131313

+0

這是什麼結構看起來像它的完整形式: – bp131313

+0

struct data int day; int月; int year; 浮動高; 浮動低; 浮沉; char條件; }; – bp131313