2014-03-05 56 views
0

我想創建這個程序,從用戶獲取一個int數然後隨機化一對數字,基於輸入,在一個struct數組中。然後根據程序隨機化的數字對的總和對這個數組進行排序。爲什麼我的程序沒有對結構進行排序?

但是我的程序不能排序結構數組。它不正確的排序,我不知道爲什麼。這是代碼。

#define MAX 10 

struct NumPair{ 
int n,m; 
}; 

int main() 
{ 
    int i, j, amount=0; 
    NumPair NumPair[MAX]; 

    srand(time(NULL)); 

    printf("How many pair of numbers? (max 10): "); 
    scanf("%d", &amount); 

    for (i=0; i<amount; i++) 
    { 
     NumPair[i].n = rand() % 11; 
     NumPair[i].m = rand() % 11; 
    } 

    for (i=0; i<amount; i++) 
    { 
     for(j=1; j<amount; j++) 
     { 
      if((NumPair[i].n+NumPair[i].m) > (NumPair[j].n+NumPair[j].m)) 
      { 
       int tmp; 

       tmp = NumPair[i].n; 
       NumPair[i].n = NumPair[j].n; 
       NumPair[j].n = tmp; 

       tmp = NumPair[i].m; 
       NumPair[i].m = NumPair[j].m; 
       NumPair[j].m = tmp; 
      } 
     } 
    } 

    for (i=0; i<amount; i++) 
    { 
     printf(" NumPair %d: (%d,%d)\n", i+1, NumPair[i].n, NumPair[i].m); 
    } 
return 0; 
} 

我錯過了什麼?這可能非常愚蠢。

在此先感謝。

+0

請注意,您不需要調用'結構NumPair Numpair'如果您已經定義這個結構。只需在main()中刪除關鍵字'struct'即可。 –

回答

2

你的算法不正確。這個小片段:

for (i=0; i<amount; i++) { 
    for(j=1; j<amount; j++) { 

將導致在ij較大的情況,然後你比較/交換是故障的(它交換如果i元素比j一個更大,如果i > j,是錯誤的比較)。

我應該提到的是(除非這是家庭作業或其他教育)C有一個完全適合的功能,可以爲您完成繁重的工作。你最好建議學習。

如果它家庭作業/教育,我想我已經給了你足夠的努力。您應該找到您要實施的特定算法,並重新訪問您的代碼。

+0

是的,這是作業。感謝您指出我的錯誤。我現在看到它爲什麼表現如此。乾杯。 –

0

您在比較迭代器ij。冒泡排序應該比較j次迭代與下一個

for (i=0; i<amount; i++) //pseudo code 
{ 
    for(j=0; j<amount-1; j++) 
    { 
     if(NumPair[j] > NumPair[j+1]) //compare your elements 
     { 
      //swap 
     } 
    } 
} 

注意,第二個圈會只有等到量-1,因爲你不想走出數組的邊界。

0

變化

for (i=0; i<amount-1; i++){ 
    for(j=i+1; j<amount; j++){ 
+0

謝謝@BLUEPIXY。這有幫助。 –

相關問題