きっかけ
実行結果
% 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()