一部で話題のスリープソートを実装してみた
きっかけ
全要素に並列でsleep(a[i])走らせて終わり次第appendしてく、っていうソートを知った(スリープソートっていうらしい)
— abap34 (@abap34) 2022年9月11日
個人的にはすき
実行結果
% node SleepSort.js Target: [ 9.001279948037155, 7.814290804058153, 5.6203515898400225, 8.88900237341443, 6.284693239942214, 7.678417600633072, 4.3539035833889645, 3.4782778608417475, 0.631035744901749, 5.799741583572917, 0.1913970742445037, 0.43133450479187374, 5.9727079749091345, 0.7017940380951004, 4.175168145227373, 3.9140154382038905, 0.7652450971294433, 9.143441457849157, 2.7689060541041854, 8.731233419192447 ] Result: [ 0.1913970742445037, 0.43133450479187374, 0.631035744901749, 0.7017940380951004, 0.7652450971294433, 2.7689060541041854, 3.4782778608417475, 3.9140154382038905, 4.175168145227373, 4.3539035833889645, 5.6203515898400225, 5.799741583572917, 5.9727079749091345, 6.284693239942214, 7.678417600633072, 7.814290804058153, 8.731233419192447, 8.88900237341443, 9.001279948037155, 9.143441457849157 ]
実装
TimerといえばsetTimeoutでお馴染みのJavaScriptですよね。 ということで、最近Promise版のsetTimeoutの話もよく見かけるのでJavaScriptで書きました。
const { setTimeout } = require("timers/promises"); const sleepSort = async (numberList) => { const sortedList = []; const appendList = (element) => { sortedList.push(element); }; const timerList = numberList.map(async (element) => { return setTimeout(element * 1000, element).then(() => { appendList(element); }); }); await Promise.all(timerList).catch((error) => { console.error(error); }); return sortedList; }; const main = () => { const length = 20; const offset = 10; const target = Array(length) .fill(offset) .map((element) => { return Math.random() * element; }); console.log("Target:"); console.log(target); sleepSort(target).then((result) => { console.log("Result:"); console.log(result); }); }; main()