2013-07-01 69 views
0

我的代碼以供選擇排序錯誤的功能選擇,排序

#include <stdio.h> 

void selection_sort(int a[], int n); 

int main() 
{ 
    int size; 

    printf("Enter the size of array: "); 
    scanf("%d",&size); 

    int b[size],i = 0; 
    printf("Enter %d integers to be sorted: ",size); 
    while(i++ < size) 
     scanf("%d",&b[i]); 
    selection_sort(b, size); 

    printf("Sorted integers(by selection sort) are: "); 
    for(int i = 0; i < size; i++) 
      printf("%d",b[i]); 

    return 0;  
} 

void selection_sort(int a[], int n) 
{ 
    while(n >= 0) 
    { 
     if(n == 0) 
      break; 
     else 
     { 
      int i = 0, c = 0; 
      int largest = a[0]; 
      while(i++ < n) 
       if(largest < a[i]) 
       { 
        c = i ; 
        largest = a[i]; 
       } 
      int temp = a[--n]; 
      a[n] = largest; 
      a[c] = temp; 
      selection_sort(a, n); 
     } 

    } 

} 

上以升序排列數組

3 4 1 2 

是給奇怪的輸出

2293388 4 3 0 

我檢查這很多時間,但沒有解決問題。 我應該怎麼做才能正確工作?
使用的算法
1.搜索數組中的最大元素。
2.將最大的元素移動到數組的最後位置。
3.遞歸調用自身以排序數組的第一個n-1元素。

請不要給任何其他解決方案,否則我會感到困惑。

+0

您期望的輸出是什麼以及您收到的輸出有什麼奇怪的現象?還有足夠的代碼來查看你如何調用該函數將有所幫助。如果'n'是數組的大小,那麼訪問'a [n]'是未定義的行爲。 –

+0

@ShafikYaghmour好的,讓我編輯 – haccks

+1

你怎麼「檢查這個」?使用調試器進行調試會告訴你,使用的索引存在一些問題(例如,代碼似乎從不檢查「a」[1]與「最大」)。即使你出於某種原因不能使用調試器,一些'printf()'傾向值(如「最大」,「i」,「c」,「n」和數組值)在每一步都會很快顯示出錯。 –

回答

1

編輯

啊,我看什麼不順心。首先,while (i++ < n)並不完全符合您的期望。它檢查條件i < n是否爲真,然後增加i。但是,似乎在條件檢查之後,i已經在正文中增加了。因此,例如,

while (i++ < n) 
    printf ("%d ", i); 

會打印出(與n=4):

1 2 3 4 

所以,你首先需要改變這種狀況。其次,外部while循環根本沒有必要。使用一個循環就足夠了。再次,將此處的while循環更改爲while (i < n),並將正文中的i增量。所以最終的代碼將是:

#include <stdio.h> 

void selection_sort(int a[], int n); 

int main() 
{ 
    int size; 

    printf("Enter the size of array: "); 
    scanf("%d", &size); 

    int b[size], i = 0; 
    printf("Enter %d integers to be sorted: ", size); 
    while(i < size) { 
     scanf("%d", &b[i]); 
     i++; 
    } 

    selection_sort(b, size); 

    printf("Sorted integers(by selection sort) are: "); 
    i = 0; 
    for(i = 0; i < size; i++) 
      printf("%d ", b[i]); 

    printf ("\n"); 
    return 0;  
} 

void selection_sort(int a[], int n) 
{ 
    if(n == 0) 
     return; 
    else 
    { 
     int i = 0, c = 0; 
     int largest = a[0]; 
     while(i < n) { 
      if(largest < a[i]) 
      { 
       c = i; 
       largest = a[i]; 
      } 
      i++; 
     } 

     int temp = a[--n]; 
     a[n] = a[c]; 
     a[c] = temp; 
     selection_sort(a, n); 
    } 
} 

我測試了這個與你給定的輸入(3 4 1 2),並打印出一個排序列表:1 2 3 4

+0

這是給出輸出'0 1 2 3' – haccks

+0

然後我很好奇你的函數參數是什麼,以及如何打印出數組元素。 – d01berg

+0

我已經發布了我的完整代碼。 – haccks

1

每當你看到這樣奇怪的大數字時,它通常會出現一個數組越界的問題。請拿一個小數據集,例如5-6個數字,並瀏覽您的程序。我相信你可以修復它。祝你好運!!