快速排 序

前言

快速排序应该是我目前遇到的排序中比较难懂的一个,在这里我将详细展示自己的理解过程,希望能够帮助到大家,至少能做个参考吧

快排原理

这里我给出一组数{7,9,3,2,4,8},我们任意选择一个数作为关键数,这里我们就都以最左边的数作为关键数,即“7”。接下来我们就要判断后面的数和7的大小关系,小于7的分为1组,大于7的另成1组,即{7,3,2,4,8,9}。(这里只是介绍原理,实际的排序以程序运行为准)然后我们再把7放到中间,(这里只需要把7和4交换)即{4,3,2,7,8,9},然后这堆数就分成了两组我
们现在只需要对这两组数重复上面的方法即可,直到每一组只剩下1个数。这里我简单记录一下排序过程
在这里插入图片描述
如果想要更深入理解快排的话可以看看这个视频冒泡排序,插入排序,快速排序的对比

程序实现

这里我只介绍一下排序的函数

void sort(int a[],int left,int right){
int l=left,r=right,key=a[l],temp;//key代表关键值,我们始终选择相对左值为关键值,temp作为媒介值使用,用于交换数据。

注意,这里的left表示绝对的“左”,其值始终为0;而l表示相对的“左”,其值会变化。right和r一样。

接下来是分组,即小于key的值为一组,大于key为另一组

while(l<r){//l的初始值为left,r为right,分别对应左右两边两个数
		while(l<r&&a[r]>key)r--;//从最右边开始判断,若此值大于key值则r-1,判断前面一个值,直到a[r]<=key。
		while(l<r&&a[l]<=key)l++;//因为key值在最左边,所以判断第一个数时肯定是相等的即a[l]=key所以要加=
		temp=a[l],a[l]=a[r],a[r]=temp;//交换值!

		}

这段代码可能会比较难懂,这里我给出它的图解
在这里插入图片描述
交换过后程序会循环,直到l和r重合,然后我们就可以把key值与lr重合位置的值交换,这样key值就到中间去了,数据被分成了两组,一大一小

temp=a[left],a[left]=a[l],a[l]=temp;

最后,只需要把分成的两组数据重复上述操作,直到每组只剩1个数据即可

if(left<l-1)sort(a,left,l-1);//如果该组只有一个数据,if就不成立
if(right>r+1)sort(a,r+1,right);

在这里插入图片描述

所有代码如下

void sort(int a[],int left,int right){//left表示绝对左值,l表示相对左值 
	int l=left,r=right,key=a[l],temp;//选择关键值 ,定义媒介值 
	while(l<r){
		while(l<r&&a[r]>key)r--;
		while(l<r&&a[l]<=key)l++;
		temp=a[l],a[l]=a[r],a[r]=temp;
		}
		temp=a[left],a[left]=a[l],a[l]=temp;
		if(left<l-1)sort(a,left,l-1);
		if(right>r+1)sort(a,r+1,right);
	}

总结

以上就是所有内容,对于一些比较复杂难懂的程序可以将其写到纸上分析,按照程序一步一步地进行,这对程序的理解很有帮助。

C++中,你可以按照以下步骤完成这个任务: 首先,你需要创建一个动态数组`R`来存储10个随机整数。然后,分别用五种算法对数组进行。以下是完整的示例代码: ```cpp #include <iostream> #include <cstdlib> // for rand and srand #include <ctime> // for time // 随机生成整数 int random_int(int min, int max) { return min + static_cast<int>(rand() % (max - min + 1)); } // 定义函数模板 template<typename T, typename Compare = std::less<T>> void sort_array(T arr[], int size, Compare comp = Compare()) { // 这里填写具体的算法实现 // ... // 示例:这里仅给出前后的打印,实际算法需要填充 std::cout << "原始数组: "; for (int i = 0; i < size; ++i) { std::cout << arr[i] << " "; } std::cout << "\n"; // ... // ... std::cout << "后数组: "; for (int i = 0; i < size; ++i) { std::cout << arr[i] << " "; } std::cout << "\n"; } int main() { srand(time(0)); // 设置随机数种子,保证每次运行结果不同 int R[10]; // 存放随机整数 for (int i = 0; i < 10; ++i) { R[i] = random_int(0, 100); // 生成0到100之间的随机数 } // 使用各自算法 sort_array(R, 10); sort_array(R, 10, std::greater<int>()); // 对于最大值,可以传递std::greater<>作为比较器 // 由于篇幅原因,下面的算法实现略去,你可以参考相应的算法教程添加它们 // 直接选择:... // 冒泡:... // 希尔:... // 快速:... return 0; } ``` 注意:上述代码仅展示了整体框架,具体算法的实现细节需要你自己补充。对于简单的算法如插入、选择、冒泡,你可以查找相关资料找到对应的代码。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值