配列内の数値を整列させる_2(隣接交換(バブルソート)法)
配列内の数値を、昇順(降順)に整列してみます。
反復(繰り返し)処理のネスト(入れ子)処理の
基礎として配列内数値の整列がよく説明されています。
この基本的な整列法として、選択法、隣接交換法、挿入法が
あります。
隣接交換(バブルソート)法の簡単な解説とプログラムしてみます。
※この説明では、昇順にすることが前提です。
1.整列対象の未整列配列要素の先頭から順に、
隣り合う2つの要素値を比較します。
この時、前要素の値 > 後要素の値の関係の場合、
この2つの要素の値を入れ替えます。
これを末尾の要素まで繰り返します。
※要素番号で考えると、
0 ? 1、 1 ? 2、 2 ? 3、3 ? 4、・・・・
と比較する。
※最初は、配列要素全体が未整列で対象です。
2.1.の操作により、整列対象の未整列配列要素の
末尾に最大値が設定されます。
この末尾の要素を整列確定済要素として、
未整列要素から外し、1.の操作を繰り返します。
3.未整列要素が、1要素になった段階(未整列の
隣接要素がない状態)で整列操作は完了となります。
この解説を図にしてみました。


では、整列_隣接交換(バブルソート)法をプログラムしてみます。
・プロジェクトを作成します。
Visual Studio 2022を起動し、
新しいプロジェクトを作成します。
・プロジェクトタイプ:"コンソールアプリ"
・プロジェクト名:"ct_107_2"
とします。



・プログラム記述・編集画面が表示されるので、
以下のプログラムを記述します。


プログラムの記述内容
// 配列内の数値を整列させる
// バブルソート(交換)法による昇順(降順)
#include <iostream>
int main()
{
// 変数宣言と初期化
int array[] = { 5,1,7,6,4,8,2,10,3,9 };
int num;
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 max_index = num - 1; max_index > 0; max_index--) {
for (int index = 0; index < max_index; index++) {
if (array[index] > array[index + 1]) {
work = array[index];
array[index] = array[index + 1];
array[index + 1] = 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 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 max_index = num - 1; max_index > 0; max_index--) {
外ループは、整列が1つ確定するごとに未整列要素の
末尾位置を1つずつ前方へ先頭要素の1つ後方まで順にずらします。
※未整列要素の範囲を設定
for (int index = 0; index < max_index; index++) {
内ループは、隣り合う要素同士を比較します。
※未整列要素内で大小関係を比較します。
if (array[index] > array[index + 1]) {
work = array[index];
array[index] = array[index + 1];
array[index + 1] = work;
前要素値 > 後要素値の場合、2つの
要素間で値を入れ替えます。
※降順に整列させたい場合には、
if (array[index] > array[index + 1]) { を
if (array[index] < array[index + 1]) { と
と記述を修正するたけで可能です。
}
}
}
・整列後の配列内数値の表示
printf("整列後 :");
for (int i = 0; i < num; i++) {
printf("%4d", array[i]);
}
printf("\n");
整列後の要素の値を表示するためのループ処理
・実行してみます。
上段メニュー"デバッグ(D)"のサブメニューより、
"デバッグなしで開始(H)"を選択します。

・実行結果は、デバッグコンソール画面が開き表示されます。
※この実行では、整列前の配列内の値と、
整列後の配列内の値を表示しています。
※この画面は、何かのキーを打鍵することで閉じることができます。


