このページの解説は C99 をベースとしています。
以下は目次です。
配列の要素を、それらの要素の値の昇順📘や降順📘になるようにソート📘したいとします。
以下のような配列があるとして、
int array[] = {5, 4, 7, 2, 8, 7, 3};
昇順であれば {2, 3, 4, 5, 7, 7, 8} という順番に、 降順であれば {8, 7, 7, 5, 4, 3, 2} という順番になるようにします。
C言語の標準ライブラリには、配列のソートをおこなう qsort関数があります。大小関係を定義した比較関数を用意して、qsort関数に、その関数ポインタを渡します。詳細は、標準ライブラリのリファレンスや、第38章を参照してください。
次のプログラムは、配列を昇順にソートしています。
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))
int compare_int(const void* a, const void* b)
{
int a_num = *(int*)a;
int b_num = *(int*)b;
return a_num - b_num;
}
void print_array(const int* array, size_t size)
{
for (size_t i = 0; i < size; ++i) {
("%d ", array[i]);
printf}
("\n");
printf}
int main(void)
{
int array[] = {5, 4, 7, 2, 8, 7, 3};
(array, SIZE_OF_ARRAY(array), sizeof(int), compare_int);
qsort(array, SIZE_OF_ARRAY(array));
print_array}
実行結果:
2 3 4 5 7 7 8
降順でソートしたい場合は、compare_int関数の実装を次のように変更します。
int compare_int(const void* a, const void* b)
{
int a_num = *(int*)a;
int b_num = *(int*)b;
return b_num - a_num;
}
余計なバグを生む可能性を考えると、あまりお勧めはできませんが、性能上の問題等でやむを得ない場合には、なんらかのソートアルゴリズムを使って、自力でソートします。
基本的なソートアルゴリズムについては、アルゴリズムとデータ構造編を参照してください。
性能的な特性が異なるソートアルゴリズムが多数あります。目的に合った性能を持ったアルゴリズムを比較・検討してください。そしてできれば、オープンソースのコードなど、よくテストされた既存のコードを使うようにしてください。自力で実装する場合は、慎重に実装しましょう。
return 0;
を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |