果報は寝て待て:おふざけsortアルゴリズム「sleep sort」を実装した
お疲れ様です。Y研究員です。古典的C言語の教科書を『写経』していたらソートのアルゴリズムが面白いので、あれこれ書いてます。前回はランダムに並べ替える、bogosortを書きました。今回はsleepを使ったソートです。
与えられた数字の長さだけsleepするスレッドを立てると、小さい順番に返ってくるのでソートができる、という塩梅です。どうやら2chの英語版4chで書れたものが最初のようです。Wikipediaにも日本語はページがありました。真面目に説明されていて、「実用では絶対に使ってはならない」と念押しまであります。他の処理に邪魔されて、順番に返ってくる保証は無いからです。4chにはShellスクリプトで書かれたみたいですが、せっかくなのでCで書きました。
#include "sort_lib.h"
#include <pthread.h>
#include <unistd.h>
void *sleeping(void *);
int main()
{
printf("sleep sort\n");
int length = 10;
int array[length];
get_array(array, length);
print_array(array, length);
pthread_t thread_id[length];
for (int i = 0; i < length; i++)
{
pthread_create( &thread_id[i], NULL, sleeping, (void*) &array[i]);
}
for (int i = 0; i < length; i++)
{
pthread_join( thread_id[i], NULL);
}
return 0;
}
void *sleeping(void *ptr)
{
int *how_long;
how_long = (int*) ptr;
usleep(*how_long * 1000);
printf("%d \n", *how_long);
}
usleepやpthreadはLinuxでしか動かないのでOS依存のコードになりました。 usleepはそのままだとマイクロ秒で結果がおかしくなるので1000倍してミリ秒に直しました。大きい数字が含まれると、例えば16進数の正数だと6万5千くらいが最大値なので最悪で65秒かかります。遅いですね。。。
ロバストなsleep sortを突き詰めるのも面白そうですが、経典の写経にそろそろ戻りたいと思います。次は関数みたいです。
写真はキュウリです。参考にした資料がカーネギーメロンだったので、メロンをGooglePhotoで検索したら出てきました。ウリ科だから似たようなものなので良しとしましょう。
ではまた!
般若心経の写経とプログラムの『写経』に関する記事はこちらからどうぞ。
参照:
4chのスクショ
https://www.cs.princeton.edu/courses/archive/fall13/cos226/lectures/52Tries.pdf
日本語のWikipediaページ(バケツソートの一部にねじ込んである。英語版には書いてない)
pthreadはここを参考にしました
無料のプログラミングクラブCoderDojoを運営するにあたり寄付を受け付けています。お金は会場費・Wifiの費用・教科書に使用します。