2016-05-27 50 views
-3

我的程序必須對另一個數組中的數組進行排序。 當我運行該程序時,它打印1 2 3 -858993460 5 -858993460 7. 我無法理解錯誤在代碼中的位置。將數組排序到另一個數組C++

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int N = 7; 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int max = arr[0]; 
    for (int i = 1; i < N; i++) 
    { 
     if (max < arr[i]) 
      max = arr[i]; 
    } 
    int sort_arr[N]; 
    for (int j = 0; j < N; j++) 
    { 
     sort_arr[arr[j] - 1] = arr[j]; 
    } 

    for (int i = 0; i < N; i++) 
    { 
     cout << sort_arr[i] << " "; 
    } 

    return 0; 
} 
+2

你到底想幹什麼這行:'sort_arr [arr [j] - 1] = arr [j];'? – user2296177

+0

當'J'爲1時,這個表達式'arr [j] - 1'評估爲'17-1',它超出了數組'arr'的範圍' –

+0

'sort_arr [arr [j] -1]數組的邊界。 (當'j'是'1'時,arr [j]'是'17','arr [j] - 1'是'16' ...並且您在哪裏對數組進行排序? – songyuanyao

回答

0

看來,你認爲sort_arr[arr[j] - 1] = arr[j]將整理成arrsort_arr。它不會。

排序已經寫好了您的位置:http://en.cppreference.com/w/cpp/algorithm/sort您可以使用這樣的:

copy(cbegin(arr), cend(arr), begin(sort_arr)); 
sort(begin(sort_arr), end(sort_arr)); 

Live Example

0

如果要排序陣列到另一個陣列,其中一個方法是你犯了一個副本然後使用標準庫中的排序函數對第二個數組進行排序。

int arr[10]; 
int b[10]; 
for(int i=0;i<10;i++) 
{ 
    cin>>arr[i]; 
    b[i]=arr[i]; 
} 
sort(b,b+10); 

//這種功能將在升序排列元素進行排序,如果你想改變順序,然後只需添加一個比較函數作爲第三arguement的排序功能。

0

好吧,讓我們面對代碼中的問題。

您看到的「奇怪」數字來自未初始化的數組sort_arr。未初始化意味着什麼?那麼sort_arr是在你的記憶中的某個地方。由於程序通常不會清除其內存,而是聲稱自由使用的內存,因此大塊sort_arr可能包含由另一個程序設置的位和字節。由於這些字節被解釋爲一個整數值,因此會發生這些數字。所以首先要做的是在使用它之前初始化數組。

sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 }; 

現在爲什麼會出現這些數字?那麼你可能希望你的算法設置sort_arr這將導致一個排序的數組中的所有值,對吧?那麼,但你的算法不能很好地工作。看到這行:

sort_arr[arr[j] - 1] = arr[j]; 

j是1時會發生什麼?然後arr[1]被評估爲17並且17-1等於16.因此sort_arr[arr[1] - 1]sort_arr[16]相同,超出了你的數組的界限。

如果你想自己設計一個排序算法,那麼我會建議以一個簡單的bubble sort算法開始。否則,如果您只需要對數組進行排序,請查看algorithm標頭。這是相當簡單的使用:

#include <iostream> 
#include <algorithm> 
#include <iterator> // << include this to use begin() and end() 

using namespace std; 

int main() 
{ 
    const int N = 7; 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 }; 

    copy(begin(arr), end(arr), begin(sort_arr)); 
    sort(begin(sort_arr), end(sort_arr)); 

    for (int i = 0; i < N; i++) 
    { 
     cout << sort_arr[i] << " "; 
    } 
    cout << endl; 
} 

順便說一句。你正在尋找陣列中最大的價值,對吧?在對數組進行排序後,sort_arr[N - 1]是數組中包含的最大值。

0

我的猜測是這是一種嘗試實現一種計數排序。請注意,可變長度數組通常不允許在C++或C的某些版本中使用。您可以使用_alloca()從堆棧中分配以獲得等效的可變長度數組:int * sort_arr =(int *)_ alloca(max * sizeof(int)); 。

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int N = 7; 
    // assuming range of values is 1 to ... 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int max = arr[0]; 
    for (int i = 1; i < N; i++) 
    { 
     if (max < arr[i]) 
      max = arr[i]; 
    } 
    int sort_arr[max]; 
    for (int i = 0; i < max; i++) 
    { 
     sort_arr[i] = 0; 
    } 
    for (int j = 0; j < N; j++) 
    { 
     sort_arr[arr[j] - 1]++; 
    } 

    for (int i = 0; i < max; i++) 
    { 
     while(sort_arr[i]) 
     { 
      cout << i+1 << " "; 
      sort_arr[i]--; 
     } 
    } 

    return 0; 
} 
相關問題