ランダムなデータを並べ替えて表示する。

それにはいくつかのバリエーションがある。

C初級セミナー

解答例1 自分で並べ替えを行う方法。

ここでは「バブルソート」と呼ばれる最も効率の悪い、しかし理解しやすい方法を示している。

#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;
}

解答例2 標準ライブラリ関数qsort()を使う方法。

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;
}

C初級セミナー


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS