C++ Bogosort 算法2025年3月22日 | 阅读 13 分钟 Bogosort 是一种非常低效的排序算法,其工作原理是通过随机排列数组中的元素,直到数组有序。由于其平均和最坏情况下的时间复杂度非常糟糕,高达阶乘,因此在实际应用中不可行。 该算法通过反复随机打乱数组元素来工作,直到数组排序。 “Bogosort” 这个名字来源于“bogus”(假的)或“fake”(虚假的)这两个词。 虽然它可能不是最高效的,但 Bogosort 作为算法设计中随机性的隐喻,以及在实际实现中效率的重要性。由于它在处理大型数据集时性能极差,因此有时被用来说明在设计排序算法时应避免的做法。 方法一:基本实现C++ 中给出的代码实现了 Bogosort 对给定整数数组的排序功能。Bogosort 是一种极其低效的算法,模拟了不断打乱数组内容直到其有序的状态。尽管 Bogosort 在现实生活中很不实用(想象一下所需的时间),但它是计算机科学中一个有趣的有趣概念,并经常被用来说明算法的防篡改性有多重要。 程序输出 说明
此代码中使用的 Bogosort 算法基于机会和蛮力。它实际上什么都不做,只是随机地反复打乱数组元素,直到最终找到一个排序的排列。由于 Bogosort 的工作方式,它效率低下且不适用于大型数据集,尤其是在所有方面。 复杂度分析时间复杂度 isSorted 函数 遍历数组一次,并将每个元素与其下一个元素进行比较。它的时间复杂度为 O(n),其中 n 是数组中的项目数。 shuffleArray 函数使用 std::random_shuffle 函数来打乱整个数组,其时间复杂度为 O(n)。在 bogosort 函数中,如果待排序数组未排序,则会重复执行此操作。由于 Bogosort 是一种时间复杂度没有上限的算法,并且基于随机打乱,因此其时间复杂度会高度变化,平均值也很高。在最极端的情况下,当它试图生成一个恰好排序的随机排列时,甚至可能接近无限。 然而,这里Bogosort 实现的总体时间复杂度也非常不稳定,并且由于 Bogosort 的特性,平均而言通常相当高。 空间复杂度 该算法的空间复杂度主要取决于存储数组和函数执行期间使用的数据结构所需的空间。 由于数组是此实现中最重要的数据结构,因此空间复杂度成为存储数组所需的内存空间量。因此,空间复杂度为 O(n),其中 n 是数组中元素的总数。 方法二:使用链表在此实现中,我们演示了如何将 Bogosort 应用于链表数据结构。链表是动态数据结构,由一系列链接在一起的元素组成,每个元素都有指向下一个项的指针。虽然由于其顺序访问特性,链表不是排序算法的首选,但链表提供了关于 BogoSort 如何应用于不同数据结构的另一种视角。 简报首先定义一个简单的链表结构,并检查排序、打乱链表以及使用链表应用 Bogosort。其中一项主要任务是演示如何使用这些函数通过 Bogosort 对整数链表进行排序。 另一方面,链表上的 Bogosort 表明该算法可以调整以适应任何数据结构,但代价是 Bogosort 本身不可避免的低效。Bogosort 在现实世界的排序项目中没有实际意义,仅用于学术目的。 程序说明
我们将调用 bogosortWithLinkedList 来执行 Bogosort 排序。此方法将排序数组并通过调用 printLinkedList 显示结果。通过执行 deleteLinkedList() 函数销毁先前分配的内存。 复杂度分析时间复杂度 isSorted 函数的时间复杂度为 O(n),其中 n 是链表中的元素数量。它通过链表查找排序错误来实现这一点。shuffleLinkedList 函数首先将链表转换为向量,其时间复杂度为 O(n),其中 n 是列表中元素的数量。接下来,向量打乱需要 O(n) 时间复杂度。最后,我们从刚刚打乱的向量中构建链表,耗时 O(n),因为这是它包含的元素数量。因此,shuffleListedList 的最终时间复杂度为O(n)。 bogosortWithLinkedList 函数不断调用 shuffleLinkedList 来对链表进行排序。BogosortWithLinkedList 的渐近最坏时间复杂度过高,可能达到非常高的值,因为 Bogosort 没有时间复杂度的上限。平均而言,冒泡排序的时间复杂度为 O((n+1)!),其中 n 是链表中的元素数量。这是因为 Bogosort 是一种随机搜索,涉及列表元素的多次排列,直到找到排序的排列。printLinkedList 函数的时间复杂度为 O(n),其中 n 是链表节点的数量。这是因为整个链表将被遍历一次以打印每个元素。 deleteLinkedList 函数在此处表现出 O(n) 的时间复杂度,其中 n 是链表中的元素数量。这是因为它对所有必须单独删除的链表执行此步骤。 整个函数的复杂度是 bogosortWithLinkedList 函数的复杂度,但由于主函数趋近于无界,平均时间复杂度非常高。 空间复杂度 给定算法的空间复杂度主要取决于存储链表和函数运行时使用的任何其他数据结构所需的空间。代码的空间复杂度也为O(n);这是因为存储链表所需的空间优先于空间复杂度。链表中每个链接所占用的空间的大小等于所有项的大小。 方法三:使用 BST使用二叉搜索树 (BST) 的 BogoSort 的做法是根据给定的元素构建 BST,并检查生成的树是否为有效的二叉搜索树。如果是,则认为元素已排序;否则,过程会重新运行,直到获得有效的 BST。 程序输出 Original elements: 5 2 7 1 9 Sorted elements: 1 2 5 7 9 说明
shuffleVector:这是一个过程,其中向量元素使用 <algorithm> 头文件中的std::random_shuffle算法随机合并。 insertIntoBST:此开关允许将值插入 BTS。此外,它还有一个算法,可以递归地遍历树并将值插入到正确的位置,同时确保BST 属性。 Construct BST:此函数的作用是从可变数量的对象创建 BST。它遍历每个元素,并使用insertIntoBST函数将每个项放入 BST。 printInorder:该函数遍历二叉搜索树,生成中序遍历,以排序顺序打印元素。 deleteBST:此函数递归地删除每个 BST,从而导致内存泄漏。
复杂度分析时间复杂度 BST 操作下的 BogoSort 的时间复杂度显示出高度可变和无界行为。在最坏的情况下,算法可能会永远运行或永不终止。当打乱过程未产生有效组合时,就会发生这种情况。 时间复杂度取决于找到导致有效 BST 的正确排列的几率。虽然发生的可能性接近零,但由此产生的预期时间复杂度非常高。 平均时间复杂度可以粗略估计为 O(n! \* h),其中 n 是元素数量,h 是生成的二叉搜索树的高度。此估计通过避免对所有可能的排列进行详尽搜索来计算验证每个排列的时间复杂度。 空间复杂度 使用 BST 的 Bogosort 的空间复杂度为 O(n),其中 n 是元素数量。这种空间复杂度是因为输入向量中存储的元素占用的空间以及BST 结构的空间。 BST 的每个节点不仅占用内存为其分配的数据值,还占用其指向左子节点和右子节点的父指针。该算法使用基于给定元素的最终 BST 创建,其空间复杂度直接与输入向量中的元素数量成正比。 |
在本文中,我们讨论了 C++ 中基于范围的 for 循环和基于迭代器的 for 循环之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 中的基于范围的 for 循环和基于迭代器的 for 循环及其语法、参数和示例。什么是基于范围的 for 循环...
阅读 6 分钟
在本文中,我们将讨论 C++ 和 Prolog 之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 和 Prolog 及其主要功能。什么是 C++?C++ 是由 Bjarne Stroustrup 于 1983 年开发的高性能通用语言,扩展了 C 语言...
7 分钟阅读
本文解释了莫兰数 (Moran Numbers) 的概念,并特别提到了 C++。莫兰数是数论中的另一个实体,因为它们具有完全不同的除法性质。它提供了更多关于数字的数字之间关系的见解...
5 分钟阅读
本文将介绍 C++ std::midpoint 的语法和示例。概述 Std::midpoint 是对现有 C++20 标准语言的重大改进,它满足了程序员对高效中点计算的需求。所讨论的函数提供了一种可定制的技术来计算...
阅读 6 分钟
引言:莫比乌斯函数主要用于组合数学,以及与数字的可除性和因子分解有关的任何事物。同样重要的是,它为许多研究过的算术函数(包括容斥原理和莫比乌斯反演公式)奠定了基础,并且...
7 分钟阅读
引言:达芬尼数 (Duffinian Numbers) 包括与它们的除数和它们的总值之间具有独特关系的数字。一个数字要成为达芬尼数,它必须是一个合数 n;比如说,它满足“n”和它的除数之和的 GCD...
阅读9分钟
引言:在数论和模运算的领域中,在素数模下寻找平方根的问题很重要,尤其是在密码学和数论应用中。Shanks Tonelli 算法提供了一种有效的方法来计算素数模下的平方根。语法:它包含...
阅读9分钟
引言:零和博弈论中的一种博弈,其中一个玩家的损失将等于另一个玩家的收益。它对于竞争的设定至关重要,其中由对手的战略行为决定。在经济学中,...
7 分钟阅读
C 和 C++ 是两种经久不衰的计算机语言。这两种语言在软件开发方面都具有强大的特性,程序员必须能够区分它们之间细微的差别。其中一种发生变化的地方是在...
5 分钟阅读
在生成特定数字模式的有趣问题时,当解决计算问题时,需要生成多行四个数字,其中每对数字都具有特定的最大公约数 (GCD)。我们将讨论如何在 C++ 中做到这一点。理解……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India