シェーカーソート

シェーカーソートはバブルソートを改良した整列アルゴリズムである。バブルソートでは、配列の前方から後方に向けて、隣接する値の大きさを比較して、必要に応じて左右入れ替えを行うアルゴリズムである。これに対して、シェーカーソートは、配列の前方から後方に向けて一度スキャンした後に、後方から前方に向けて再度スキャンする。このように、シェーカーソートは、前方から後方、そして後方から前方にスキャンを繰り返していく整列アルゴリズムである。

#include <stdio.h>

void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void shakerSort(int array[], int n) {
    int i, j, k;

    for(i = 0; i < n; i++) {
        
        // head to tail
        for(j = i + 1; j < n; j++) {
            if(array[j] < array[j - 1]) {
                swap(&array[j], &array[j - 1]);
            }
        }
        n--;

        // tail to head
        for(k = n - 1; k > i; k--) {
            if(array[k] < array[k - 1]) {
                swap(&array[k], &array[k - 1]);
            }
        }
    }
}

int main (void) {

    int i;
    int array[10] = {3, 6, 1, 7, 2, 0, 4, 5, 9, 8};

    printf("       array: ");
    for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    shakerSort(array, 0, sizeof(array) / sizeof(array[0]));

    printf("sorted array: ");
    for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}