ランダムなデータを並べ替えて表示する。
それにはいくつかのバリエーションがある。
ここでは「バブルソート」と呼ばれる最も効率の悪い、しかし理解しやすい方法を示している。
#include <stdio.h>
#include <stdlib.h>
// メイン
int main(void){
const int num=10;
int data[num];
int i,j;
srand(time(NULL));
// ランダムな数値を入れる
for(i=0;i<num;i++)
data[i]=rand()%1000;
// データを表示する
for(i=0;i<num;i++)
printf("%d ",data[i]);
printf("\n");
// データを並べ替える(バブルソート)
for(i=num-1;i>0;i--){
for(j=0;j<i;j++){
if(data[j]>data[j+1]){
int d=data[j];
data[j]=data[j+1];
data[j+1]=d;
}
}
}
// データを表示する
for(i=0;i<num;i++)
printf("%d ",data[i]);
printf("\n");
return 0;
}
qsort(data,num,size,comp)は「クイックソート」というアルゴリズムを用いて配列データを並べ替える。
この関数は4つの引数を持つ。
この中でわかりにくいのは比較関数compだろう。
この関数は、下記の例のように2つのvoid *d1とvoid *d2を受け取り、d1がd2より前に来るべきであれば負の数、同じであればゼロ、後に来るべきであれば正の数を返す。
もし整数を小さい順に並べ替えたいのであれば、単に差を返せばよい。
もし整数を大きい順に並べ替えたいのであれば、逆向きの差を返せばよい。
構造体の配列のような複雑な構造を持ったデータも、任意の順に並べ替えられるのでとても便利である。
#include <stdio.h>
#include <stdlib.h>
// 比較関数
int comp(const void *d1,const void *d2){
int a1=*(int*)d1;
int a2=*(int*)d2;
return a1-a2;
}
// メイン
int main(void){
const int num=10;
int data[num];
int i;
// ランダムな数値を入れる
for(i=0;i<num;i++)
data[i]=rand()%1000;
// データを表示する
for(i=0;i<num;i++)
printf("%d ",data[i]);
printf("\n");
// データを並べ替える
qsort(data,10,sizeof(int),comp);
// データを表示する
for(i=0;i<num;i++)
printf("%d ",data[i]);
printf("\n");
return 0;
}