#include #include #include #include #define N 26 /* ソートするものの個数 */ #define MAX 99 /* 数値データは 0 ... MAX */ #define swap(I,J) { int tmp = a[(I)]; a[(I)] = a[(J)]; a[(J)] = tmp; } int myrand(int max); void print(int lo, int p, int hi); void sort(int lo, int hi); int a[N]; main() { int i; srand((unsigned)time(NULL)); /* 現在時刻で乱数の種を初期化 */ for (i=0; i= hi) { /* lo >= hi のときは何もしなくてよい */ return; } mi = (lo + hi) / 2; pivot = a[mi]; /* これを pivot に選ぶ理由は特にない */ a[mi] = a[lo]; /* a[lo] は空いたと思おう */ p = lo; i = lo + 1; /* 下の while の各くりかえしの最初と最後では「lo < j <= p ならば */ /* a[j] < pivot」「p < j < i ならば a[j] >= pivot」が成り立つことに注意 */ while (i <= hi) { if (a[i] < pivot) { p++; /* swap(++p, i) は不可(マクロなので) */ swap(p, i); /* p == i なら何もしないに等しい */ } i++; } a[lo] = a[p]; a[p] = pivot; print(lo, p, hi); /* 確認のため印字 */ sort(lo, p-1), sort(p+1, hi); }