C++の宿題で困っています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kos-mos

C++の宿題で困っています。

#1

投稿記事 by kos-mos » 15年前

今回は選択ソートを用いて値の小さい順に表示させるという宿題についての質問です。

宿題の内容は以下の通りです。

=問題=

一次配列(要素は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;
	}
}

kazuoni

Re:C++の宿題で困っています。

#2

投稿記事 by kazuoni » 15年前

//1-3. 最小値の要素とソート済み位置+1の要素を交換する。 

int temp = min;

min = array[sortedPos +1];

array[sortedPos +1] = temp;
ではなくて、

array[minPos] = array[sortedPos +1];

array[sortedPos +1] = min;
ではないでしょうか?

kazuoni

Re:C++の宿題で困っています。

#3

投稿記事 by kazuoni » 15年前

#補足
なぜできていなかったかを、デバッガで追ってみてください。
VC++のようなので、ブレークポイントが使えます。
っといっても、数値の入れ替えができていないだけなんですけどね^^;

non

Re:C++の宿題で困っています。

#4

投稿記事 by non » 15年前

>1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら

考え方がわからない。なんでって思う。
先頭は0でしょう。その方が自然です。

minをわざわざ覚えておく必要もないかも、INDEXだけ覚えておけば充分。
for(sortedPos = 0; sortedPos < N ; sortedPos++){
		
		//1-1. ソート済み位置+1の位置に格納されている要素を最小値とし、その 値と位置を保存する。 
		minPos = sortedPos ;

		//1-2. 現在位置をソート済み位置+2から配列の末尾まで変えながら以下の 処理を繰り返す。 
		for(pos = sortedPos +1; pos < N; pos++){
			
			//1-2-1. 現在位置の要素が最小値よりも小さいならば、その値と位置 を最小値と最小値の位置に代入する。 
			if(array[pos] < array[minPos]){
				minPos = pos;
			}
		}

kos-mos

Re:C++の宿題で困っています。

#5

投稿記事 by kos-mos » 15年前

皆さまのおかげで無事なりました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る