先頭へ戻る

配列をソートする | Programming Place Plus C言語編 逆引き

Programming Place Plus トップページ -- C言語編 -- 逆引き

先頭へ戻る

この章の概要

この章の概要です。

目的

配列の要素を、それらの要素の値の昇順や降順になるように並び替える(ソート)したいとします。

以下のような配列があるとして、

int array[] = {5, 4, 7, 2, 8, 7, 3};

昇順であれば {2, 3, 4, 5, 7, 7, 8} という順番に、 降順であれば {8, 7, 7, 5, 4, 3, 2} という順番になるようにします。

方法①(qsort関数を使う)

C言語の標準ライブラリには、配列のソートを行う qsort関数があります。大小関係を定義した比較関数を用意して、qsort関数に、その関数ポインタを渡します。詳細は、標準ライブラリのリファレンスや、第38章を参照してください。

次のプログラムは、配列を昇順にソートしています。

#include <stdio.h>
#include <stdlib.h>

#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

int compareInt(const void* a, const void* b)
{
    int aNum = *(int*)a;
    int bNum = *(int*)b;

    return aNum - bNum;
}

void printArray(const int* array, size_t size)
{
    for (size_t i = 0; i < size; ++i) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main(void)
{
    int array[] = {5, 4, 7, 2, 8, 7, 3};

    qsort(array, SIZE_OF_ARRAY(array), sizeof(int), compareInt);
    printArray(array, SIZE_OF_ARRAY(array));

    return 0;
}

実行結果:

2 3 4 5 7 7 8

降順でソートしたい場合は、compareInt関数の実装を次のように変更します。

int compareInt(const void* a, const void* b)
{
    int aNum = *(int*)a;
    int bNum = *(int*)b;

    return bNum - aNum;
}

方法②(自力でソートする)

余計なバグを生む可能性を考えると、あまりお勧めはできませんが、性能上の問題等でやむを得ない場合には、なんらかのソートアルゴリズムを使って、自力でソートします。

基本的なソートアルゴリズムについては、アルゴリズムとデータ構造編を参照してください。

性能的な特性が異なるソートアルゴリズムが多数あります。目的に合った性能を持ったアルゴリズムを比較・検討してください。そしてできれば、オープンソースのコードなど、よくテストされた既存のコードを使うようにしてください。自力で実装する場合は、慎重に実装しましょう。


参考リンク


更新履歴

'2017/6/2 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー