ダン・クァン・ミン Blog

はじめまして

Sample About Sort

Binary Sort

void BinSort(int x[ ], int n)
{
    int i, j;

    if (n > MAX_DATA) {
        printf("データが多すぎます!\n");
        return;
    }
    else {
        for (i = 0; i < MAX_DATA; i++)
            Bin[i] = 0;             /* 作業用配列の初期化 */

        for (i = 0; i < n; i++)     /* x[i] の値の */
            Bin[x[i]]++;            /* Bin[ ] の要素の値を */
                                    /* インクリメント */
        j = 0;                      /* x[ ] の添字として使用 */
        for (i = 0; i < MAX_DATA ; i++)
            if (Bin[i])             /* 0でなければ */
            x[j++] = i;             /* 書き戻す */
    }
}

Buble Sort

int BubSort(int x[ ], int n)
{
    int i, j, temp;

    for (i = 0; i < n - 1; i++) {
        for (j = n - 1; j > i; j--) {
            if (x[j - 1] > x[j]) {  /* 前の要素の方が大きかったら */
                temp = x[j];        /* 交換する */
                x[j] = x[j - 1];
                x[j - 1]= temp;
            }
        }
        /* ソートの途中経過を表示 */
        ShowData(x, NUM_DATA);
    }
}

Heap Sort

void Hpsort(int a[ ], int n)
{
    int leaf, root;

    leaf = n;                   /* 初期値は末尾の要素 */
    root = n/2;                 /* 初期値はその親 */

    while (root > 0 ) {         /* 半順序木を構成 */
        DownHeap(a, leaf, root);
        root--;
    }

    while(leaf > 0) {
        Swap(a, 1, leaf);       /* 半順序木の根と末尾の要素を交換 */
        leaf--;                 /* 末尾の要素を半順序木から外す */
        DownHeap(a, leaf, 1);   /* 半順序木を再構成する */
    }
}

void DownHeap(int a[ ],  int leaf, int root)
{
    int i;

    i = root * 2;
    while (i <= leaf) {
        if (i < leaf && a[i + 1] > a[i])  /* a[i] と a[i + 1]  の大きい方と */
            i++;
        if (a[root] >= a[i])              /* a[root] と比較 */
            break;                        /* 子の方が大きければ */
        Swap(a, root, i);                 /* 交換 */

        root = i;                         /* 更にその子についても調べる */
        i = root * 2;
    }
}

void Swap(int a[ ], int i, int j)
{
    int temp;

    temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

Quick Sort

void QSort(int x[ ], int left, int right)
{
    int i, j;
    int pivot;

    i = left;                      /* ソートする配列の一番小さい要素の添字 */
    j = right;                     /* ソートする配列の一番大きい要素の添字 */

    pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */

    while (1) {                    /* 無限ループ */

        while (x[i] < pivot)       /* pivot より大きい値が */
            i++;                   /* 出るまで i を増加させる */

        while (pivot < x[j])       /* pivot より小さい値が */
            j--;                   /*  出るまで j を減少させる */
        if (i >= j)                /* i >= j なら */
            break;                 /* 無限ループから抜ける */

        Swap(x, i, j);             /* x[i] と x[j]を交換 */
        i++;                       /* 次のデータ */
        j--;
    }

    if (left < i - 1)              /* 基準値の左に 2 以上要素があれば */
        QSort(x, left, i - 1);     /* 左の配列を Q ソートする */
    if (j + 1 <  right)            /* 基準値の右に 2 以上要素があれば */
        QSort(x, j + 1, right);    /* 右の配列を Q ソートする */
}

void Swap(int x[ ], int i, int j)
{
    int temp;

    temp = x[i];
    x[i] = x[j];
    x[j] = temp;
}

Comments