C++ 快速排序实现2024年8月28日 | 阅读 12 分钟 快速排序是一种流行的排序技术,以其时间复杂度和效率而闻名。 历史快速排序算法由 Tony Hoare 于 1959 年在他的计算机科学论文中开发。它是最高效且广泛使用的排序算法之一。 快速排序的历史可以追溯到计算机科学早期对排序算法的研究。英国计算机科学家 Tony Hoare 开发了快速排序,作为对现有排序算法的更有效替代方案。 Hoare 最初用 Algol 60 编程语言开发了该算法,并于 1961 年在他的题为“Quicksort”的论文中发表。他将该算法描述为一种分治法,利用元素的划分来实现高效排序。 快速排序因其实用性上的简洁性和效率而广受欢迎。它的平均时间复杂度为 O(n log n),使其在大多数情况下成为最快的排序算法之一。该算法也非常适合大型数据集,并具有良好的缓存性能。 多年来,快速排序经历了各种优化和改进。已经提出了该算法的不同变体,例如随机快速排序和三路划分快速排序,以进一步提高其性能并处理特定场景。 如今,快速排序在实践中被广泛使用,并且通常是许多编程语言和库中排序的默认选择。其高效的特性、易于实现的优点和多功能性使其成为各种应用的流行选择。 C++ 快速排序实现输出 Original array: 64 25 12 22 11 Sorted array: 11 12 22 25 64 说明
示例示例 1:使用字符串数组在 C++ 中进行快速排序输出 Original Array: apple banana cherry date grape fig Sorted Array: apple banana cherry date fig grape 说明
partition 接受一个字符串向量 arr 和两个索引 low 和 high。 它选择最右边的元素 (arr[high]) 作为主元。 它将范围 [low, high-1] 中的每个元素与主元进行比较。 如果元素小于或等于主元,则将其移到主元的左侧。 循环结束后,它将主元放置在其正确的位置,较小的元素在左侧,较大的元素在右侧,并返回主元索引。
quickSort 通过递归选择主元和划分数组来对字符串向量进行排序。 它从由 low 和 high 定义的范围开始。 如果 low 小于 high,则 调用 partition 来查找主元索引 (pi) 并划分数组。 对主元之前和之后的左右子数组递归应用 quickSort。
初始化一个字符串向量 arr,其中包含未排序的元素。 打印原始数组。 调用 quickSort 对数组进行排序。
在此示例中,快速排序用于对字符串向量进行排序。partition 和 swap 操作基于字符串比较执行。编译并运行此代码,以查看快速排序如何应用于不同的数据类型。 示例 2:对浮点数数组进行排序输出 Original Array: 9.1 7.2 5.3 11.4 2.5 1.6 Sorted Array: 1.6 2.5 5.3 7.2 9.1 11.4 说明
示例 3:对自定义对象进行排序输出 Original Students: Alice - 85 Bob - 72 Charlie - 94 David - 68 Eve - 91 Sorted Students (by score): David - 68 Bob - 72 Alice - 85 Eve - 91 Charlie - 94 说明
定义了一个名为 Student 的自定义类来表示学生。 每个 Student 对象有两个属性:name(字符串)和 score(整数)。 提供了一个构造函数,用于在创建 Student 对象时初始化这些属性。
定义了一个名为 compareStudents 的自定义比较函数。 该函数接受两个 Student 对象作为输入,并根据它们的分数属性进行比较。 如果第一个学生的分数小于第二个学生的分数,则返回 true,表示第一个学生在排序顺序中应排在第二个之前。
在 main 函数中,创建了一个名为 students 的向量。 该向量包含多个 Student 对象,每个对象代表一个具有姓名和分数的学生。
程序将原始学生列表打印到控制台。 对于 students 向量中的每个学生,它都会显示该学生的姓名和分数。
std::sort 函数用于对 students 向量进行排序。 它根据分数以升序重新排列学生。 compareStudents 函数用作比较标准,以确定排序过程中学生的顺序。
排序后,程序再次将学生列表打印到控制台。 这次,它按分数升序显示学生,显示他们的姓名和分数。 总之,此程序演示了如何定义自定义类 (Student),创建该类的对象,根据特定属性 (score) 对其进行排序,并显示原始和排序后的学生列表。排序使用带有自定义比较函数的 std::sort 函数执行。 在此示例中,我们有一个自定义 Student 类,我们使用快速排序根据分数对 Student 对象向量进行排序。 这些示例演示了快速排序在对不同数据类型和自定义对象进行排序方面的灵活性。您可以根据需要定义适当的比较函数或运算符重载来使快速排序适用于各种数据结构。 快速排序的应用快速排序是一种流行的排序算法,它通过将数组划分为两个子数组并递归地对它们进行排序来工作。它以其效率而闻名,并广泛用于需要排序的各种应用中。以下是一些快速排序的常见应用
快速排序的优点
这些优点使快速排序成为许多需要排序的应用的首选。但是,重要的是要注意,在某些情况下,快速排序的最坏情况时间复杂度为 O(n^2),尽管在实践中这种情况相对罕见。 下一个主题C++ 中的排序算法 |
在 c++ 中,哈希集合是包含唯一元素的无序集合。标准的集合操作,如删除、包含在 c++ 中。标准的基于集合的操作,如交集、对称差集和并集,由 c++ 构成。为了识别和搜索项目,哈希……
阅读 4 分钟
给定三个变量 a、b 和 c,我们的任务是在不使用任何算术、关系和条件运算符的情况下设置 x 的值。我们需要遵循以下规则。方法:如果 c = 0 则 x = a 否则 //...
阅读 3 分钟
“自定义排序字符串”是指一种对字符串进行排序的特定方式,该方式偏离了标准的词典(字典)顺序。在自定义排序中,您为字符串中的字符或子字符串定义自己的顺序。此自定义顺序可以基于各种标准,例如特定的字符...
阅读9分钟
ios::rdstate() 是 C++ 输入/输出流库的重要组成部分。它使程序员能够评估流的当前状态。理解此函数对于 C++ 程序进行可靠的错误处理和流管理至关重要。什么是 ios::rdstate() 函数?“rdstate”一词是指...
阅读 4 分钟
在解决与最大子数组和相关的问题时,Kadane 算法经常成为首选解决方案。在本博客文章中,我们将探讨此问题的一个有趣变体,并确定最大的循环子数组和。我们将探讨基本概念,提供详尽的...
阅读 4 分钟
摘要:在本文中,我们将学习 . seekg() 函数允许在 iostream 库中访问任何文件位置。它是文件处理的一部分,可以在 fstream 头文件中找到。它用于从输入流中提取...。
阅读 4 分钟
介绍:当与输出流一起使用时,tellp() 函数返回流中“put”指针的当前位置。它没有参数,并返回 pos_type 成员类型的值,pos_type 是一个整数数据类型,表示 put 流指针的当前位置。语法:pos_typetellp(); 返回值:如果成功,则为当前...
阅读1分钟
在此程序中,我们从用户那里获取斐波那契三角形的限制输入,并打印给定次数(限制)的斐波那契序列。让我们看一下生成斐波那契三角形的 C++ 示例。示例 #include <iostream> using namespace std; int main() { int a=0,b=1,i,c,n,j; ...
阅读 3 分钟
C++ 有一套命名变量、函数和其他标识符的代码规则。这些规则称为命名约定,有助于使您的代码更具可读性和可维护性。变量名的指南应具有描述性和意义。例如,保存...的变量。
阅读9分钟
引言:随着信息时代的到来,产生了海量数据。由于需要保护人们的隐私,保护敏感信息变得越来越重要。因此,信息在网络传输和系统内存存储过程中受到保护的方式...
11 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India