今度は先ほどご指導いただいた「挿入ソートを用いて値の小さい順に表示させる」という宿題についての疑問なのですが、これを「大きい順」にするにはどのようにしたらいいのでしょうか?
先ほどの宿題の内容は以下の通りです。
=問題=
一次配列(要素は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;
}
}