ITP1_2_C: Sorting Three Numbers

「ITP1_2_C: Sorting Three Numbers」の編集履歴(バックアップ)一覧に戻る

ITP1_2_C: Sorting Three Numbers - (2016/03/19 (土) 07:58:16) のソース

Branch on Condition - Sorting Three Numbers


たった3つの数を並べ替えるのにqsortは大げさな気がするが検索してみた。
http://www.cc.kyoto-su.ac.jp/~yamada/ap/qsort.html
ページを開いて10秒ほどコードを見てこれはおかしいと気づいた。
このサイトのコードのテストデータを下記のようにいじくってみたところ出鱈目な出力を出す。
20億と-20億の引き算が桁あふれを起こしているようだ。


 #include <stdio.h>
 #include <stdlib.h>
 
 int compare_int(const void *a, const void *b)
 {
     return *(int*)a - *(int*)b;
 }
  
 main()
 {
    int data[] = {4, 2, 3, 6, 3, 2, 1, 3, 20000*100000, -20000*100000};
    int i;
 
    qsort(data, 10, sizeof(int), compare_int);
    for (i = 0; i < 10; i++) {
        printf("%d ", data[i]);
    }
    printf("\n");
 }




compare_intが間違ってるので修正して問題を解いた。
何故比較演算で済むところを問題を引き起こしやすい四則演算を採用したのか理解に苦しむ。

 #include <stdio.h>
 #include <stdlib.h>
 
 int compare_int(const void *a, const void *b)
 {
    return *(int*)a > *(int*)b;
 }
 
 main()
 {
    int a[3];
	scanf("%d %d %d\n",&a[0],&a[1],&a[2]);
    qsort(a, 3, sizeof(int), compare_int);
     printf("%d %d %d\n",a[0],a[1],a[2]);
 }