#include void QSort1(double value[], int low, int high); int partition(double value[], int low, int high); main(){ double value[10]; int i; printf("ソート前(数字を10件入力して下さい)\n"); for (i=0; i<10; i++) { // データの入力(配列) scanf("%lf", &value[i] ); } QSort1(value, 0, 9); // クイックソート printf("ソート後\n"); for(i=0 ; i<10 ; i++) { // ソート後の表示 printf("%6.2f\n", value[i] ); } } //---- クイックソート (value[low]からvalue[high]までを整列) void QSort1(double value[], int low, int high) { int v; // 枢軸のインデックス if (low >= high) return; // 整列の対象要素が1つのため終了 v = partition(value, low, high); // value[low]からvalue[high]までを枢軸で分割 QSort1(value, low, v-1); // 枢軸の右側(小さい要素)を整列 QSort1(value, v+1, high); // 枢軸の左側(大きい要素)を整列 } //---- 分割 (value[low]からvalue[high]までを枢軸で分割) int partition(double value[], int low, int high) { int i; // 対象要素をlowからhigh方向に進めるポインタ int j; // 対象要素をhighからlow方向に進めるポインタ double pivot; // 枢軸の値 double tmp; i = low - 1; // ポインタの初期化 j = high; pivot = value[high]; // 枢軸の値を右端(high)に設定 while(1) { while (value[++i] < pivot); // 枢軸の値より大きい要素が見つかるまでポインタを右に進める while (i < --j && pivot < value[j]); // 枢軸の値より小さい要素が見つかるまでポインタを左に進める if (i >= j) break; // 両ポインタが入れ替わったら繰り返し終了 tmp = value[i]; // value[i]とvalue[j]を交換する value[i] = value[j]; value[j] = tmp; } tmp = value[i]; // value[i]とvalue[high]を交換する value[i] = value[high]; // (枢軸の値をi番目に設定) value[high] = tmp; return i; // 枢軸のインデックスを返す }