サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−