今度は先ほどご指導いただいた「挿入ソートを用いて値の小さい順に表示させる」という宿題についての疑問なのですが、これを「大きい順」にするにはどのようにしたらいいのでしょうか?
先ほどの宿題の内容は以下の通りです。
=問題=
一次配列(要素は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};
挿入ソート(insertion sort)アルゴリズムを用いる。
=アルゴリズム=
1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。
1-2. 挿入位置←ソート済み位置+1
1-3. 現在位置←ソート済み位置
1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処 理を繰り返す。
1-4-1. 現在位置の要素を1つ後ろの位置に格納する。
1-4-2. 挿入位置←現在位置
1-4-3. 現在位置を配列の先頭方向に1つ戻す。
1-5. 挿入要素を挿入位置に格納する。
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 insertElem; //挿入要素 int insertPos; //挿入位置 //1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。 for(sortedPos = -1; sortedPos < N-1; sortedPos++){ //1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。 insertElem = array[sortedPos +1]; //1-2. 挿入位置←ソート済み位置+1 insertPos = sortedPos +1; //1-3. 現在位置←ソート済み位置 pos = sortedPos; //1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。 while( pos >= 0 && array[pos] > insertElem){ //1-4-1. 現在位置の要素を1つ後ろの位置に格納する。 array[pos +1] = array[pos]; //1-4-2. 挿入位置←現在位置 insertPos = pos; //1-4-3. 現在位置を配列の先頭方向に1つ戻す。 pos = pos -1; } //1-5. 挿入要素を挿入位置に格納する。 array[insertPos] = insertElem; } //2. 配列の各要素を表示する。 for(int i = 0; i < N; i++){ cout << array <<endl; } }