算法界的卧龙与凤雏,搭配项目经理使用效果更佳!

有一天,你收到了项目经理的指示,要求你故意降低项目的效率,方便在后期收钱优化时有更多的操作空间。面对这种情况,你是否还在毫无头绪地使用高效的排序算法呢?

别担心,因为在这个世界上,凡是卧龙所在之处,必有凤雏。此时,睡眠排序与猴子排序将成为你的救星!

睡眠排序

睡眠排序法(Sleep Sort)是一种基于时间复杂度和并发编程思想的非传统排序算法。

其核心原理是:将要排序的数字作为等待(睡觉)时间,让线程等待这段时间后(睡醒后)输出。

这是一个有用但低效的排序方法。尽管它并不适合在实际场景中使用,但无疑为我们提供了一种富有创意的排序方式,让我们在学习过程中保持愉快的心情。

function sleepSort(arr) {
  arr.forEach((item) => {
    setTimeout(() => {
      console.log(item);
    }, item);
  });
}

sleepSort([3, 1, 4, 1, 5, 9]);

猴子排序

猴子排序(Bogo Sort)是一种随机排序算法,其原理等同于将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。

它的平均时间复杂度为 O((n+1)!), 因为对于n个元素的数组,有(n+1)!种可能的排列。在猴子排序算法中,我们不断随机打乱数组,直到得到一个已排序的数组。

理论上,我们可能需要尝试所有可能的排列才能找到正确的排序,因此平均时间复杂度为 O((n+1)!).

然而,在最坏情况下,猴子排序的时间复杂度是无穷大(无限),因为算法可能永远都无法随机得到正确的排序。

function isSorted(arr) {
  for (let i = 1; i < arr.length; i++) {
    if (arr[i - 1] > arr[i]) {
      return false;
    }
  }
  return true;
}

function bogoSort(arr) {
  let shuffledArray;
  while (!isSorted(arr)) {
    shuffledArray = arr.sort(() => Math.random() - 0.5);
  }
  return shuffledArray;
}

console.log(bogoSort([3, 1, 4, 1, 5, 9]));

当然直接这样写就有点太明显了,新来的实习生都能看出来有问题,那么我们就继续修改一下,保留猴子排序的思想,但又不希望代码太容易被识别出来。


    function monkeySort(arr) {
      let isSorted = false;
      while (!isSorted) {
        for (let i = 1; i < arr.length; i++) {
          if (arr[i - 1] > arr[i]) {
            let j = i;
            while (j > 0 && arr[j - 1] > arr[j]) {
              [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]];
              j--;
            }
          }
        }
        isSorted = true;
        for (let i = 1; i < arr.length; i++) {
          if (arr[i - 1] > arr[i]) {
            isSorted = false;
            break;
          }
        }
      }
      return arr;
    }
    
    let arr = [3, 1, 4, 1, 5, 9];
    console.log("Before sorting:", arr);

    arr = monkeySort(arr);
    console.log("After sorting:", arr);

我们用插入排序来进行一下伪装,这个修改与插入排序非常相似,但使用了猴子排序的思想来随机打乱数组。我们首先检查数组是否已经有序,如果没有,我们进行一次遍历,对于每个逆序对,我们将其元素交换,然后将交换后的子数组插入到已排序的子数组中。

在交换元素后,我们再次检查数组是否已经有序,如果没有,我们将继续进行下一轮排序。如果在某一轮排序中没有进行任何交换,我们就认为数组已经有序,退出循环。

在这个示例中,我们创建一个未排序的数组 [3, 1, 4, 1, 5, 9],然后将其传递给 monkeySort 函数进行排序。在排序过程中,monkeySort 函数使用了猴子排序的思想,在遍历数组时随机打乱数组,然后使用插入排序的思想将打乱后的数组排序。最终,函数返回已排序的数组 [1, 1, 3, 4, 5, 9]

其他

除了睡眠排序和猴子排序,实际上还有许多其他的趣味排序算法。

例如,慢速排序(Slow Sort)是一种非常低效的排序算法,基于递归的思想。这个算法的时间复杂度为 O(n^3),比睡眠排序法稍微好一点,但仍然非常低效。

例如,侏儒排序(Gnome Sort)是一种类似于冒泡排序的简单排序算法。在最坏的情况下,时间复杂度为 O(n^2)。尽管这个算法的时间复杂度比睡眠排序法要好一些,但它仍然被认为是低效的。

虽然这些排序算法在现实项目中并无实际应用价值,但它们为我们提供了独特的思考角度,帮助我们更好地理解排序算法的各种可能性。

当然,这里的描述带有一定的搞笑成分,我并不鼓励在实际项目中故意降低效率。

通过了解这些趣味排序算法,我们可以更好地理解排序算法的原理,以及如何避免低效的设计。
同时,它们还为我们提供了一个轻松愉快的学习环境,有助于我们更深入地了解算法的本质。

原文链接:https://juejin.cn/post/7213262414643904549 作者:吹水一流

(0)
上一篇 2023年3月22日 下午7:16
下一篇 2023年3月22日 下午7:26

相关推荐

发表回复

登录后才能评论