/*
配列の値のソートについて以下の通りに関数q_sort(int *a, int left, int right)を作れって問題なんですがさっぱりわからないので教えて下さい
1)配列中の適当な値(例えば中央にある値)をkey値とする
2)a. 左からkeyより大きい値を探し見つかったらストップ(i番目)
  b. 右からkeyより小さい値を探し見つかったらストップ(j番目)
  c. i≧jなら 3) へ、そうでなければi番目の値とj番目の値を入れ替えて、i+=1, j-=1 として 2)a から繰り返し
3)前方の配列の長さが2以上なら 1) 2) を繰り返す(前方の配列に対して関数q_sortの再帰呼び出し)
4)後方の配列の長さが2以上なら 1) 2) を繰り返す(後方の配列に対して関数q_sortの再帰呼び出し) 
*/

#include <stdio.h>

void q_sort(int *a, int left, int right)
{
  int k, i = left, j = right, m = (right + left) / 2;
  while(1){
    for( ; i <= right; ++i) if(a[i] > a[m]) break;
    for( ; j >= left; --j) if(a[j] < a[m]) break;
    if(i >= j) break;
    k = a[j]; a[j] = a[i]; a[i] = k;
    ++i; --j;
  }
  if(m - left > 0) q_sort(a, left, m);
  if(right - m > 0) q_sort(a, m, right);
}

int main(int ac, char **av)
{
  int i, ary[5] = {3, 1, 4, 5, 2};
  q_sort(ary, 0, 4);
  for(i = 0; i < sizeof(ary) / sizeof(ary[0]); ++i) printf("%d, ", ary[i]);
  return 0;
}