スリープソート

時間を使ったソート。
今年ちょっと話題になって初めてブログで見たときは、お〜なるほど〜って感じだった。
いつ使うの?と聞かれると、まだわからないとしか言えないけど、何かに使えるはず。
WindowsだったらSleepはミリ秒でスレッド実行できるようなので実用性++か?


[sleep_sort.c]

#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <wait.h>

#define N 10 /* データ件数 */

int sort[N];
int count;
void SleepSort(void);
void output(void);

void SleepSort(void) {
    int i;
    for (i = 0; i < N; i++) {
        switch (fork()) {
            case -1:
                assert(0);
                break;
            case 0:
                /* child process */
                sleep(sort[i]);
                printf("%d\n", sort[i]);
                exit(0);
                break;
            default:
                break;
        }   
    }
    for (i = 0; i < N; i++) {
        while (wait(NULL) <= 0)
            assert(errno == EINTR);
    }
}
                                                                                          

int main(void) {
    int i;
    
    srand((unsigned int) time(NULL));
    for (i = 0; i < N; i++) {
        sort[i]  = rand() % 10;
    }

    printf("Stundy...\n");
    output();

    printf("Start...\n");
    SleepSort();
    printf("End...\n");

    return EXIT_SUCCESS;
}


void output(void){
    int i = 0;
    printf("sort => [");
    while(1){
        printf("%d", sort[i]); 
        if (i != N - 1) {
            printf(","); 
        }
        else{
            printf("]\n"); 
            break;
        }
        ++i;
    }
}

cでも、もっとカンタンな実装があるし
シェルでも簡単に書ける。
こっちの方が実用性があるかも。

[sleep_sort.bash]

#!/bin/bash
function f() {
    sleep "$1"
    echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

実行サンプル

/bin/bash sleep_sort.bash 7 4 1 3 2 6 8 0 9 5
0
1
2
3
4
5
6
7
8
9