配列内の数値を整列させる_1(選択法)
配列内の数値を、昇順(降順)に整列してみます。
反復(繰り返し)処理のネスト(入れ子)処理の
基礎として配列内数値の整列がよく説明されています。
この基本的な整列法として、選択法、隣接交換法、
挿入法などがあります。
選択法の簡単な解説とプログラムしてみます。
※この説明では、昇順に整列させることが前提です。
1.整列対象の未整列配列要素の中から、最小値を探します。
※最初は、配列要素全体が未整列で対象となります。
2.見つかった最小値と、未整列対象配列の先頭位置の
値とを入れ替えます。
※見つかった最小値が、未整列対象配列の先頭位置と
同じ位置の場合は、入替を行う必要はありません。
3.未整列対象配列の先頭位置を整列確定として、
未整列対象配列から外します。
※これにより、未整列対象配列の先頭位置は、
次の要素位置になります。
4.1. 2. 3. の操作を未整列対象配列要素がなくなるまで
(末尾の要素まで)繰り返します。
この解説を図にしてみました。
では、整列_選択法をプログラムしてみます。
・プロジェクトを作成します。
Visual Studio 2022を起動し、
新しいプロジェクトを作成します。
・プロジェクトタイプ:"コンソールアプリ"
・プロジェクト名:"ct_107_1"
とします。
・プログラム記述・編集画面が表示されるので、
以下のプログラムを記述します。
プログラムの記述内容
// 配列内の数値を整列させる // 選択法による昇順(降順) #include <iostream> int main() { // 変数宣言と初期化 int array[] = { 5,1,7,6,4,8,2,10,3,9 }; int num; int min_index; int work; // array配列の要素数を取得 num = sizeof(array) / sizeof(array[0]); // 整列前の配列内数値の表示 printf("整列前 :"); for (int i = 0; i < num; i++) { printf("%4d", array[i]); } printf("\n"); // 整列前配列内から最小値を探しながら入替ループ for (int head = 0; head < num - 1; head++) { min_index = head; // 最小値の探索 for (int index = head + 1; index < num; index++) { if (array[min_index] > array[index]) { min_index = index; } } // 最小値の入れ替え if (head != min_index) { work = array[head]; array[head] = array[min_index]; array[min_index] = work; } } // 整列後の配列内数値の表示 printf("整列後 :"); for (int i = 0; i < num; i++) { printf("%4d", array[i]); } printf("\n"); return EXIT_SUCCESS; }
簡単なプログラム解説です。
・変数宣言と初期化 int array[] = { 5,1,7,6,4,8,2,10,3,9 }; 整列に使用する未整列値の配列を宣言します。 int num; 配列の要素数を格納するための変数 int min_index; 探索中の最小値の要素位置(要素番号)を格納するための変数 int work; 2つの要素間で値を入れ替える時の値の仮置き用変数 ・array配列の要素数を取得 num = sizeof(array) / sizeof(array[0]); この式によって、配列内の要素数を取得できます。 ・整列前の配列内数値の表示 printf("整列前 :"); for (int i = 0; i < num; i++) { printf("%4d", array[i]); } printf("\n"); 整列前の各要素の値を表示するためのループ処理です。 ・整列前配列内から最小値を探しながら入替ループ for (int head = 0; head < num - 1; head++) { 外ループは、整列が1つ確定するごとに未整列要素の 先頭位置を1つずつ後方へ末尾要素の1つ手前までずらします。 ※未整列要素の範囲を設定 min_index = head; 未整列配列の先頭要素の位置を最小値の比較対象 位置として仮格納(仮置き)します。 for (int index = head + 1; index < num; index++) { 内ループでは未整列配列要素の2番目から仮置き値と比較し、 末尾の要素まで探索し、最小値の位置を確定します。 ※未整列要素内で最小値を探索します。 if (array[min_index] > array[index]) { min_index = index; 仮置き値より小さい値を発見したら、仮置き 位置を更新し、最小値位置を更新します。 ※降順に整列させたい場合には、 "if (array[min_index] > array[index]) {" を "if (array[min_index] < array[index]) {" と 記述を修正( ">" → "<" )するたけで可能です。 } } if (head != min_index) { work = array[head]; array[head] = array[min_index]; array[min_index] = work; 最小値の位置が、未整列の先頭位置から更新されて いる場合、その二つの位置の値を入れ替えます。 ※これで、未整列配列内の最小値が、未整列配列内の 先頭位置に設定されます。 } } ・整列後の配列内数値の表示 printf("整列後 :"); for (int i = 0; i < num; i++) { printf("%4d", array[i]); } printf("\n"); 整列後の各要素の値を表示するためのループ処理です。
・実行してみます。
上段メニュー"デバッグ(D)"のサブメニューより、
"デバッグなしで開始(H)"を選択します。
・実行結果は、デバッグコンソール画面が開き表示されます。
※この実行では、整列前(未整列状態)の配列内の値と、
整列後(整列済み状態)の配列内の値を表示しています。
※この画面は、何かのキーを打鍵することで閉じることができます。