c言語 qsort
#include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct{ int i; char str[5]; } hoge; int Comp(const void *, const void *); void print(hoge *); // メイン int main(){ hoge shoge[SIZE] = { {3, "abc"}, {1, "ABC"}, {9, "uyr"}, {2, "4gy"}, {4, "stg"}, {0, "ggg"}, {8, "1gv"}, {3, "fyg"}, {7, "chr"}, {2, "bga"}, }; print(shoge); qsort(&shoge, SIZE, sizeof(hoge), Comp); print(shoge); return 0; } // 比較用関数 int Comp(const void *p1, const void *p2){ const hoge *psp1 = (hoge *)p1; const hoge *psp2 = (hoge *)p2; if(psp1->i < psp2->i){ return -1; }else if(psp1->i > psp2->i){ return 1; }else{ return 0; } } // 表示関数 void print(hoge *pshoge){ int i; for(i = 0; i < SIZE; i++){ printf("%d %s\n", pshoge[i].i, pshoge[i].str); } printf("\n\n"); return; }
【実行結果】 3 abc 1 ABC 9 uyr 2 4gy 4 stg 0 ggg 8 1gv 3 fyg 7 chr 2 bga 0 ggg 1 ABC 2 bga 2 4gy 3 abc 3 fyg 4 stg 7 chr 8 1gv 9 uyr
★ポイント ・比較用の関数を新たの定義すること。 名前は自由。 比較するのが構造体なら、どれを「比較キー」にするかを 決めて、処理を作る。 要素1が要素2の前に来るときにはマイナス値を返す 逆に要素2が要素1の前に来るときには プラス値を返す。 どちらが前でも良いときには、0を返す。 比較関数のパラメータは常にconst void *。 関数呼び出し直後に比較する要素の型にキャストする。 ・qsort(並び替え対象ポインタ ・・・通常は配列名など , 並び替え対象内の要素の個数 , 1つの要素のサイズ ・・・sizeof()などで指定 , 比較関数 ・・・比較関数の関数名を指定 );