C言語で書いてみました

過去の情報処理技術者試験の出題をもとにして、Cのソースを起こしてみました。

■ クイックソート(平成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;
}