/*
配列の値のソートについて以下の通りに関数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;
}
LyoK6YWN5YiX44Gu5YCk44Gu44K944O844OI44Gr44Gk44GE44Gm5Lul5LiL44Gu6YCa44KK44Gr6Zai5pWwcV9zb3J0KGludCAqYSwgaW50IGxlZnQsIGludCByaWdodCnjgpLkvZzjgozjgaPjgabllY/poYzjgarjgpPjgafjgZnjgYzjgZXjgaPjgbHjgorjgo/jgYvjgonjgarjgYTjga7jgafmlZnjgYjjgabkuIvjgZXjgYQKMSnphY3liJfkuK3jga7pganlvZPjgarlgKQo5L6L44GI44Gw5Lit5aSu44Gr44GC44KL5YCkKeOCkmtleeWApOOBqOOBmeOCiwoyKWEuIOW3puOBi+OCiWtleeOCiOOCiuWkp+OBjeOBhOWApOOCkuaOouOBl+imi+OBpOOBi+OBo+OBn+OCieOCueODiOODg+ODlyhp55Wq55uuKQogIGIuIOWPs+OBi+OCiWtleeOCiOOCiuWwj+OBleOBhOWApOOCkuaOouOBl+imi+OBpOOBi+OBo+OBn+OCieOCueODiOODg+ODlyhq55Wq55uuKQogIGMuIGniiadq44Gq44KJIDMpIOOBuOOAgeOBneOBhuOBp+OBquOBkeOCjOOBsGnnlarnm67jga7lgKTjgahq55Wq55uu44Gu5YCk44KS5YWl44KM5pu/44GI44Gm44CBaSs9MSwgai09MSDjgajjgZfjgaYgMilhIOOBi+OCiee5sOOCiui/lOOBlwozKeWJjeaWueOBrumFjeWIl+OBrumVt+OBleOBjDLku6XkuIrjgarjgokgMSkgMikg44KS57mw44KK6L+U44GZKOWJjeaWueOBrumFjeWIl+OBq+WvvuOBl+OBpumWouaVsHFfc29ydOOBruWGjeW4sOWRvOOBs+WHuuOBlykKNCnlvozmlrnjga7phY3liJfjga7plbfjgZXjgYwy5Lul5LiK44Gq44KJIDEpIDIpIOOCkue5sOOCiui/lOOBmSjlvozmlrnjga7phY3liJfjgavlr77jgZfjgabplqLmlbBxX3NvcnTjga7lho3luLDlkbzjgbPlh7rjgZcpIAoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+Cgp2b2lkIHFfc29ydChpbnQgKmEsIGludCBsZWZ0LCBpbnQgcmlnaHQpCnsKICBpbnQgaywgaSA9IGxlZnQsIGogPSByaWdodCwgbSA9IChyaWdodCArIGxlZnQpIC8gMjsKICB3aGlsZSgxKXsKICAgIGZvciggOyBpIDw9IHJpZ2h0OyArK2kpIGlmKGFbaV0gPiBhW21dKSBicmVhazsKICAgIGZvciggOyBqID49IGxlZnQ7IC0taikgaWYoYVtqXSA8IGFbbV0pIGJyZWFrOwogICAgaWYoaSA+PSBqKSBicmVhazsKICAgIGsgPSBhW2pdOyBhW2pdID0gYVtpXTsgYVtpXSA9IGs7CiAgICArK2k7IC0tajsKICB9CiAgaWYobSAtIGxlZnQgPiAwKSBxX3NvcnQoYSwgbGVmdCwgbSk7CiAgaWYocmlnaHQgLSBtID4gMCkgcV9zb3J0KGEsIG0sIHJpZ2h0KTsKfQoKaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCnsKICBpbnQgaSwgYXJ5WzVdID0gezMsIDEsIDQsIDUsIDJ9OwogIHFfc29ydChhcnksIDAsIDQpOwogIGZvcihpID0gMDsgaSA8IHNpemVvZihhcnkpIC8gc2l6ZW9mKGFyeVswXSk7ICsraSkgcHJpbnRmKCIlZCwgIiwgYXJ5W2ldKTsKICByZXR1cm4gMDsKfQ==