#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 に選ぶ理由は特にない */ swap(mi, hi); /* pivot は a[hi] によけておく */ i = lo; j = hi-1; /* 下の while の各くりかえしの最初と最後では「k < i => a[k] < pivot, */ /* j < k < hi => a[k] >= pivot」が成り立つことに注意 */ while (i <= j) { if (a[i] < pivot) { i++; } else { swap(i, j); j--; } } /* ここへきたときは i = j+1 */ a[hi] = a[i]; a[i] = pivot; /* よけておいた pivot と交換 */ print(lo, i, hi); /* 確認のため印字 */ sort(lo, i-1), sort(i+1, hi); }