今回は「選択法」とか「セレクションソート」と呼ばれる方法で、並べ替えを行ってみます。
最初に考え方を説明しますので、次のアニメーションを良く見てください。
※3周目以降は割愛しています。
前回の方法と違って、比較する2つの要素が隣り合っていません。
最初の1周は0番目の値とそれ以降の値をすべて比較しています。
2周目は1番目の値とそれ以降の値を比較しています。
3周目は2番目の値とそれ以降の値、4周目は3番目の値とそれ以降を・・・
最後の9周目は8番目の値とそれ以降の値を比較します。
それぞれ、基準となる要素(1周目は0番目)の値と比較する値の大小を調べ、基準となる要素の値の方が大きい場合に入れ換えが行われます。
次は図を1枚ずつ見ていきます。
初期状態です。
まずは基準となる要素を0番目として、基準の右隣(1番目)と比較します。
基準はそのままで、比較対象を右へずらし比較します。
基準となる値の方が大きい場合、入れ換えを行います。
さらに比較対象を右にずらし比較します。
最後に9番目の要素と比較して1周目が完了です。
2周目は基準を1番目にずらし、比較は基準の右隣から開始します。
最後に9番目の要素と比較して2周目が完了です。
3週目は2番目の要素を基準として、基準の右隣から9番目まで比較します。
4週目は3番目の要素を基準として、基準の右隣から9番目まで比較します。
5週目は4番目の要素を基準として、基準の右隣から9番目まで比較します。
6週目は5番目の要素を基準として、基準の右隣から9番目まで比較します。
7週目は6番目の要素を基準として、基準の右隣から9番目まで比較します。
8週目は7番目の要素を基準として、基準の右隣から9番目まで比較します。
9週目は8番目の要素を基準として、基準の右隣から9番目まで比較します。
この時点で一番大きな数が右端(9番目)に入っていますので、これで終わりです。
今回のソートのポイントは以下の通りです。
周目 | 基準 | 比較対象 |
---|---|---|
1周目 | 0番目 | 1〜9番目 |
2周目 | 1番目 | 2〜9番目 |
3周目 | 2番目 | 3〜9番目 |
4周目 | 3番目 | 4〜9番目 |
5周目 | 4番目 | 5〜9番目 |
6周目 | 5番目 | 6〜9番目 |
7周目 | 6番目 | 7〜9番目 |
8周目 | 7番目 | 8〜9番目 |
9周目 | 8番目 | 9番目 |
1.基準は0から1ずつ増えています。
2.比較対象は基準+1から9まで変化します。
3.基準の方が大きければ入れ換えを行います。
ポイント1と2は二重ループで作成できそうです。
では、↓のプログラムを元に作成してみましょう。
<sample program 069-00>
#include <stdio.h> #define COUNT 10 int main(void) { int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 }; int i; int j; int work; /* ここにプログラムを追加 */ for (i = 0; i < COUNT; i++) { printf("data[%d] = %d\n", i, data[i]); } return 0; } |
<実行結果>
data[0] = 9 data[1] = 12 data[2] = 23 data[3] = 32 data[4] = 45 data[5] = 55 data[6] = 67 data[7] = 76 data[8] = 88 data[9] = 98 続行するには何かキーを押してください・・・
解答例です。
<sample program 069-01>
#include <stdio.h> #define COUNT 10 int main(void) { int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 }; int i; int j; int work; for (i = 0; i < COUNT - 1; i++) { for (j = i + 1; j < COUNT; j++) { if (data[i] > data[j]) { work = data[i]; data[i] = data[j]; data[j] = work; } } } for (i = 0; i < COUNT; i++) { printf("data[%d] = %d\n", i, data[i]); } return 0; } |
<実行結果>
data[0] = 9 data[1] = 12 data[2] = 23 data[3] = 32 data[4] = 45 data[5] = 55 data[6] = 67 data[7] = 76 data[8] = 88 data[9] = 98 続行するには何かキーを押してください・・・
基準は0から8まで変化しますので、
for (i=0; i<COUNT-1; i++) { } |
↑のループで実現できます。
基準が1増える間に比較対象は基準+1から9まで変化しますから、
for (i=0; i<COUNT-1; i++) { for (j=i+1; j<COUNT; j++) { } } |
内側に基準+1から始まるループを入れれば完成です。
前回に引き続きソートのプログラムを作成しましたが、他にもソートの実現方法は沢山あります。
比較的考え方が簡単な2種類のソートを紹介しましたが、色々調べて他の方法も試してください。
ちなみに小さい順に並べ替えることを昇順ソート、大きい順だと降順ソートと言います。