2012-09-27 57 views
0

這是我的功能:選擇升序排列

int main() { 
    double data[100]; 

    int num; 

    cout<<"num= "; 
    cin>>num; 

    for(int i = 1; i <= num; i++) { 
     cout<<i<<" element = "; 
     cin>>data[i]; 
    } 

    Sort(data, num); 

    for (int i = 1; i <= num; i++) { 
     cout<<data[i]<<endl; 
    } 

    return 0; 
} 

void Sort(double data[], int n) { 
    int i,j,k; 
    double min; 

    for(i = 0; i < n-1; i++) { 
     k = i; 
     min = data[k]; 

     for(j = i+1; j < n; j++) 
      if(data[j] < min) { 
       k = j; 
       min = data[k]; 
      } 
     data[k] = data[i]; 
     data[i] = min; 
    } 
} 

如果我寫的進出口。三個元素:8,9,1再cout 8,9,1?

+2

你是否通過代碼來查看發生了什麼? – Borgleader

回答

1
for(int i = 1; i <= num; i++) { // WRONG 

我想你的意思:

for(int i = 0; i < num; i++) { // RIGHT 

數組在C是0索引記得。

1

你的排序功能沒問題。唯一的問題是,您輸入1n(含)的元素,而在main()函數的兩個循環中應使用0n-1(含)。

如果需要1通過n打印號碼,使用

cout<<(i+1)<<" element = "; 
1

你應該習慣的0指數在開始for循環 for(int i = 0; i < N; ++i)

因此修復這兩個指數的錯誤會讓你代碼正常運行。

的理由是:

如果使用1作爲開始時將數據寫入到data[],你的數據數組的第一個項目將是一個隨機數:

如果插入3個元素的數組是這樣的:

data[0] = ??? // maybe a very very big number 
data[1] = 8 
data[2] = 9 
data[3] = 1 

,並在你的排序功能,索引從0開始和num之前結束,這意味着你的代碼只會排序data[0], data[1], data[2]

如果你使用:NUM = 3,3 2 1作爲原點碼輸入數據,你可以看到,3和2排序

我猜你的排序代碼是從什麼地方用Google搜索,請理解它。

良好的網上課程算法:https://www.coursera.org/course/algs4partI

一個非常好的算法的在線圖書:http://algs4.cs.princeton.edu/home/

順便說一句,for(j = i+1; j < n; j++)Sort功能會更好,如果它有{}括號。