すのものの「いろいろ」(その147)

ソートの過程を色で表示する(table 版)

前々項の続き。

<pre> にするから一行が長くなるのだ、と気がついた。 それをやめ、「#」一つにつきソースファイルでは一行とし、 <br> で改行させればこの問題はなくなるのだが、 一つ一つの「#」が一つの単語とみなされ、 間にスペースを置いて表示されるので間があきすぎる。 また、横幅が広くなりすぎてうまくない。

table を出力させるなら次のようにする。

#include <stdio.h>
#include <stdlib.h> /* srand() */
#include <time.h>   /* time() */

#define N 100

void init(void);
void print(void);
void quicksort(int i, int j);
void swap(int i, int j);

int a[N];

int main() {
    printf("<html>\n");         /* html の最初の部分。略式 :-) */
    printf("<body>\n");
    printf("<p>\n");
    printf("<table border=\"1\" cellspacing=\"0\">\n");

    init();
    print();
    quicksort(0, N-1);

    printf("</table>\n");
    printf("</p>\n");           /* html の最後の部分。略式 :-) */
    printf("</body>\n");
    printf("</html>\n");

    return 0;
}


void init(void) {
    int i;

    for (i = 0; i < N; i++) {
        a[i] = i;
    }
    srand((unsigned)time(NULL));    /* 現在時刻で乱数の種を初期化 */
    for (i = N-1; i > 0; i--) {     /* シャッフルする */
        swap(i, rand() % (i+1));
    }
    return;
}


/* 配列 a[0] ... a[N-1] を“色で”印字 */
void print(void) {
    int i;

    printf("<tr>\n");
    for (i = 0; i < N; i++) {
        printf("<td bgcolor=\"");
        switch(a[i] / 20) {
            case 0: printf("#ff%02x0f",  15 + a[i] % 20 * 12); break;
            case 1: printf("#%02xff0f", 255 - a[i] % 20 * 12); break;
            case 2: printf("#0fff%02x",  15 + a[i] % 20 * 12); break;
            case 3: printf("#0f%02xff", 255 - a[i] % 20 * 12); break;
            case 4: printf("#%02x0fff",  15 + a[i] % 20 * 12); break;
            default: ;
        }
        printf("\">&nbsp;</td>\n");
    }
    printf("</tr>\n");
}

void swap(int i, int j) {
    int tmp;

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


/* ↓あまりしっかりチェックしていないのでミスがあるかも */
void quicksort(int left, int right) {
    int i, j;
    int pivot;

    if (left >= right) {
        return;
    }

    pivot = a[left];
    i = left;
    j = right;
    while (i < j) {
        while (i <= right && a[i] <= pivot) {
            i++;
        }
        while (j >= left && a[j] >= pivot) {
            j--;
        }
        if (i < j) {
            swap(i, j); i++; j--;
        }
    }
    /* ここへきたときは i == j または i == j + 1 になっている */
    if (i != j || a[i] > pivot) {
        i--;
    }
    swap(left, i);

    print();
    quicksort(left, i-1);
    quicksort(i+1, right);
}

出力例。

                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       
                                                                                                                                                                                                       

付) この出力例では重複行を除去する操作をしていない。 また、縁をなくし、colspan を使えばバイト数を減らせるが、 それを行なうにはいったん全データを二重配列に保持してから、となりそうだ。

2006-03-20 (1) 02:11:41 +0900


すのもの Sunomono