2016-05-27 18 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'は配列 'arr'の境界外にある' 17-1'と評価されます –

+0

'sort_arr [arr [j] - 1]'が出ています配列の境界の(arr [j]は '17 '、' arr [j] -1は '16')...配列をどこでソートしたのですか? – songyuanyao

答えて

0

あなたがsort_arr[arr[j] - 1] = arr[j]sort_arrarrを並べ替えられますことを考えるようです。それはできません。

ソートは、すでにここであなたのために書かれている: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

を2番目の配列をソートするには、標準ライブラリのsort関数を使用します。

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

//昇順に配列の要素をソートし、あなたはその後、順序を変更したい場合は、単にソート関数の3番目の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; 
} 
関連する問題