サイトマップ / C言語講座>出入り口>総目次>目次:ソート>単純挿入ソート
/* 今日は、単純挿入ソートについて学びます。単純挿入ソートのアルゴリズムは単純です。あらかじめソートが終わっている配列に、データを挿入します。
要素数 n 個の配列があるとします。最初は一番左の1個のデータのソートが済んでいるとします。次に、2 番目の要素をそこに付け加えます。この時点では、1 番目と 2 番目の要素の比較が行われます。これで二つの要素のソートが済んだことになります。
次に、この配列に 3 番目の要素を付け加えます。3番目の要素と2番目の要素の比較が行われ、もし、3 番目の要素の方が小さければ、1 番目の要素との比較も行われ、挿入する位置が決まります。
上記の処理を順次行って行けばソートが終わります。
今回のソースプログラムでは、8 個の要素からなるint 型の配列の要素をソートします。 */
#include <stdio.h> #define NUM_DATA 8 void InsSort(int num[ ], int n) ; void ShowData(int num[ ], int n); void main(void); /* n 個のデータの単純挿入ソートを行う */ void InsSort(int num[ ], int n) { int i, j, temp; for (i = 1; i < n; i++) { /* i 番目の要素をソート済みの配列に挿入 */ temp = num[i]; /* i 番目の要素を temp に保存 */ for (j = i; j > 0 && num[j-1] > temp; j--) /* このループで */ num[j] = num[j -1]; /* temp を挿入する位置を決める */ num[j] = temp; /* temp を挿入 */ ShowData(num, NUM_DATA); /* 途中経過を表示 */ } } /* n 個のデータを表示 */ void ShowData(int num[ ], int n) { while (n--) printf("%d ", *num++); printf("\n"); } void main(void) { /* ソート対象のデータ */ int num[ ] = {3, 7, 1, 5, 4, 2, 6, 0}; /* ソート前のデータの表示 */ printf("ソート前: "); ShowData(num, NUM_DATA); printf("\n"); /* ソート */ InsSort(num, NUM_DATA); printf("\n"); /* ソート後のデータの表示 */ printf("ソート後: "); ShowData(num, NUM_DATA); printf("\n"); } |
/* プログラムを実行すると、要素の交換が行われた時に、ソートの途中経過も表示されます。単純挿入ソートのアルゴリズムを理解するのに役立つでしょう。 */
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−