8.ソーティング(選択ソート・バブルソート)8.1.ソーティングとはある集合に属する要素の有限列(同じ要素が2回以上現れてもよい)が与えられた時、与えられた順序に従って要素を並べ換えることを「ソーティング」と言います。例えば3の倍数からなる自然数集合に属する数10個を、小さい数から順に並べ替えることはソーティングです。 数字に限らず、文字列でも人間でも比較の方法さえ決まってさえいれば、ソーティングをすることができます。 8.2. 選択ソート(selection sort)n個の数字を昇順(小さいもの順)に並べるアルゴリズムとして、最も単純なものは以下のようなものです。
このアルゴリズムを「選択ソート」(単純選択法)と呼びます。これを実装したサンプルプログラムを以下に示します。5〜12行目は乱数を発生させて指定個の数字を持つ配列を生成する関数で、14〜31行目は選択ソートを実行する関数、33〜38行目は配列内部の数字を表示する関数です。このサンプルを実行すると、最初に10個の乱数列が表示され、最後にソート後の数列が表示されます。 1: #include<stdio.h>
2: #include<stdlib.h>
3: #include<time.h>
4:
5: void create_array(int num[],int length){
6: int i;
7:
8: srand(time(NULL));
9: for(i=0;i<length;i++){
10: num[i]=rand()%100;
11: }
12:}
13:
14:void selection_sort(int num[],int length){
15: int i,n,tmp;
16: int min,min_pos;
17:
18: for(i=0;i<length-1;i++){
19: min=num[i]; //仮の最小値を最初の数にセット
20: min_pos=i; //仮の最小値の場所も覚える
21: for(n=i+1;n<length;n++){
22: if(num[n]<min){ //比較対象の数字が仮の最小値より小さければ、仮の最小値をそれにする
23: min=num[n];
24: min_pos=n;
25: }
26: }
27: tmp=num[i]; //最小値と最初の数を入れ替え
28: num[i]=min;
29: num[min_pos]=tmp;
30: }
31:}
32:
33:void print_array(int num[],int length){
34: int i;
35: for(i=0;i<length;i++){
36: printf("num[%d]=%d\n",i,num[i]);
37: }
38:}
39:
40:int main(int argc,char *argv[]){
41: int length=10;
42: int num[length];
43:
44: create_array(num,length);
45: print_array(num,length);
46: puts("");
47: selection_sort(num,length);
48: print_array(num,length);
49:
50: return(0);
51:}
(実習課題)8.1のサンプルプログラムを改良しなさい。
8.2.バブルソート選択ソートは最小値を探すとき、「仮の最小値」と「仮の最小値の場所」の2つの情報を覚えていなければなりません。それらを覚えずにすむように改良したものが、「バブルソート」です。バブルソートのアルゴリズムは以下の通りです。今回もn個の数列を昇順に並べ替える場合を例にしています。
![]() 数字が次々と先頭に移動していく処理の過程が、「泡が沸き立っていく」様子に似ていることから「バブルソート」と呼ばれています。 (実習課題)以下のプログラムを作成しなさい。
(実習課題)以下のプログラムを作成しなさい。
|
![]()
![]()
|