宿題の内容は以下の通りです。
=問題=
一次配列(要素はint型、要素数は30)に格納されている要素を値の小さい順に並べ替える。
配列の初期値は以下のように,配列の初期化で指定する.
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
選択ソート(selection sort)アルゴリズムを用いる。
=アルゴリズム=
1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、 配列末尾の要素番号-1になるまで以下の処理を繰り返す。
1-1. ソート済み位置+1の位置に格納されている要素を最小値とし、その 値と位置を保存する。
1-2. 現在位置をソート済み位置+2から配列の末尾まで変えながら以下の 処理を繰り返す。
1-2-1. 現在位置の要素が最小値よりも小さいならば、その値と位置 を最小値と最小値の位置に代入する。
1-3. 最小値の要素とソート済み位置+1の要素を交換する。
2. 配列の各要素を表示する。
現在わかる範囲で以下のように書いてみたところ、
実行すると一応ソートはされているのですが、要素の内の一部の値が何度も表示されてしまいました。
すべての値を小さい順にソートされた状態で表示させたいのですが、ここからどうすればいいのか全く分かりません。
OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
初投稿なので至らないところもあると思いますが、どうかよろしく願いします。
#include <iostream> using namespace std; #define N 30 //配列の要素数 void main(){ int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999}; int sortedPos; //ソート済み位置 int pos; //現在位置 int min; //最小値 int minPos; //最小値の位置 //1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、 配列末尾の要素番号-1になるまで以下の処理を繰り返す。 for(sortedPos = -1; sortedPos < N-1; sortedPos++){ //1-1. ソート済み位置+1の位置に格納されている要素を最小値とし、その 値と位置を保存する。 min = array[sortedPos +1]; minPos = sortedPos +1; //1-2. 現在位置をソート済み位置+2から配列の末尾まで変えながら以下の 処理を繰り返す。 for(pos = sortedPos +2; pos < N; pos++){ //1-2-1. 現在位置の要素が最小値よりも小さいならば、その値と位置 を最小値と最小値の位置に代入する。 if(array[pos] < min){ min = array[pos]; minPos = pos; } } //1-3. 最小値の要素とソート済み位置+1の要素を交換する。 int temp = min; min = array[sortedPos +1]; array[sortedPos +1] = temp; } //2. 配列の各要素を表示する。 for(int i = 0; i < N; i++){ cout << array <<endl; } }