カタベログ

IT技術に関するブログを書きたい.食べ物関連はInstagramをご参照の事.

一部で話題のスリープソートを実装してみた

 きっかけ

実行結果

%  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()