■ クイックソート(平成14年春期午後問4)
#include <stdio.h>
/* 基本情報 平成14年春期午後問4 */
/* クイックソート */
#define true 1
#define false 0
/* 配列の要素の値を表示 */
void _debug(int *A, int Min, int Max)
{
int i;
for (i = 0; i < 9; i++)
printf("%d,", *(A+i));
printf("%d | %d | %d |\n", *(A+9), Min, Max);
}
void FindPivot(int A[], int Min, int Max, int *Ret)
{
int Pivot, K;
int Found;
Pivot = A[Min];
K = Min + 1;
*Ret = -1;
Found = false;
while (K <= Max && !Found) {
if (A[K] == Pivot) {
K++;
} else {
Found = true;
if (A[K] > Pivot)
*Ret = K;
else
*Ret = Min;
}
}
}
void Arrange(int A[], int Min, int Max, int Pivot, int *Ret)
{
int L, R, Tmp;
L = Min;
R = Max;
while (L <= R) {
Tmp = A[L];
A[L] = A[R];
A[R] = Tmp;
if (A[L] < Pivot) L++;
if (A[R] >= Pivot) R--;
}
*Ret = L;
}
void QuickSort(int A[], int Min, int Max)
{
int Pivot, J, K, L;
_debug(A, Min, Max);
FindPivot(A, Min, Max, &J);
if (J > -1) {
Pivot = A[J];
Arrange(A, Min, Max, Pivot, &K);
L = K - 1;
QuickSort(A, Min, L);
QuickSort(A, K, Max);
}
}
int main()
{
int A[] = { 3,5,8,4,0,6,9,1,2,7 };
QuickSort(A, 0, 9);
return 0;
}