2014-03-04 32 views
2

所以我剛剛開始學習C和算法,並且在我的選擇排序算法中遇到了一個問題。它給我這個作爲輸出:C選擇排序謬誤,不會排序最後3個數字

>10 
>12 
>13 
>16 
>23 
>25 
>42 
>60 
>50 
>52 

最後三位數字是亂序。從我的眼睛看,他們不應該。你能告訴我們這裏有什麼問題嗎?此外,我的目標是沒有任何指示,這樣做,它仍然有點模糊從最後一次講座,我知道它可以完成沒有它。我相信這比內存錯誤更符合邏輯。謝謝大家!

#include <stdio.h> 
int main(void) { 
    int max = 10; 
    int a[max]; 
    //Makes unsorted array 
    a[0] = 10; 
    a[1] = 23; 
    a[2] = 50; 
    a[3] = 12; 
    a[4] = 52; 
    a[5] = 60; 
    a[6] = 25; 
    a[7] = 13; 
    a[8] = 42; 
    a[9] = 16; 

/* 
    SWAP MODEL 
    printf("a[2] = %d \n", a[2]); 
    int temp = a[3]; 
    a[3] = a[2]; 
    a[2] = temp; 
    printf("a[2] = %d \n", a[2]); 
*/  
    //Sorts array 
    int n; 
    int s = 0; 
    int p = 0; 
    for (n = 0; n < max-1; n++){ 
     int smallest = a[n]; 
     for(s = n + 1; s < max; s++){ 
      if(smallest > a[s]) { 
       smallest = a[s]; 
       p = s; 
      } 
     } 
     if (n == 0 && p == 0) { 
      int temp = a[n]; 
      a[n] = a[p]; 
      a[p] = temp; 
     } 
     else if (n > 0 && p == 0) { 
      p = n; 
      int temp = a[n]; 
      a[n] = a[p]; 
      a[p] = temp; 
     } 
     else { 
      int temp = a[n]; 
      a[n] = a[p]; 
      a[p] = temp; 
     } 
    } 

     //Checks if sorted 
    for(int number = 0; number < 10; number++) { 
     printf("%d \n", a[number]); 
    } 
} 
+1

+1,用於提供可編譯的示例。 – this

回答

3
int smallest = a[n]; 

在這裏,你忘了初始化p = n,所以你不變smallest == a[p]被違反。隨着增加它的作品。

一些更多的評論:

if (n == 0 && p == 0) { 
     int temp = a[n]; 
     a[n] = a[p]; 
     a[p] = temp; 
    } 
    else if (n > 0 && p == 0) { 
     p = n; 
     int temp = a[n]; 
     a[n] = a[p]; 
     a[p] = temp; 
    } 
    else { 
     int temp = a[n]; 
     a[n] = a[p]; 
     a[p] = temp; 
    } 

這整個結構是多餘的,它只是做同樣的事情在任何情況下。您可以通過無條件交換替換它。我在清理版本中的嘗試:

for (int n = 0; n < max-1; n++){ 
    int p = n; 
    int smallest = a[p]; 
    for (int s = n + 1; s < max; s++){ 
     if (smallest > a[s]) { 
      smallest = a[s]; 
      p = s; 
     } 
    } 
    int temp = a[n]; 
    a[n] = a[p]; 
    a[p] = temp; 
} 
+0

而不是取代整個cunstruct,我會測試'(p> n)',然後執行交換或者什麼也不做。 – chaosmasttter

+0

@chaosmasttter:我會避免檢查,因爲代碼更簡單,因爲性能可能會因爲分支預測失誤而更差(後面的假設我必須通過一些時間點來驗證) –

+0

您是對的,我忘了這件事。 – chaosmasttter