【算法】C++快排——通俗易懂的理解方式

一、排序算法

排序算法大体可分为两类:

一种是稳定的排序算法,主要有:冒泡排序插入排序归并排序

另一种则是不稳定的排序算法,主要有:选择排序希尔排序堆排序快速排序
排序算法时间、空间复杂度
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个元素要O(nlogn)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlogn)算法更快,因为它的内部循环可以在大部分的架构上很有效率地被实现出来。

二、快排思路

1.思路:分治、“挖坑”

  1. 找一个轴点,把它出来存在一个变量中,然后把比轴点小的数放在它左边,比它大的数放在它右边
  2. 一个区间一个区间地进行递归处理
  3. 最后当所有区间都仅剩一个数时,排序完成

快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动

2.步骤

1.先把a[i]出来存在一个临时变量x
在这里插入图片描述
此时a[i] 就已经 了出来,可以存放一个比x小的数
2.循环开始:(结束条件:i>=j)

  1. 从当前数组最右端 j 开始遍历,直到找到比x小的数
    在这里插入图片描述
2. 把a[j]**挖出来**放到a[i]处,i往右移动一格
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711214822465.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTExODIwMw==,size_16,color_FFFFFF,t_70)
3. 此时 **a[j]** 可以存放 **比x大** 的数
4. 再从当前数组**最左端i**开始遍历,直到找到**比x大**的数
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711215446546.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTExODIwMw==,size_16,color_FFFFFF,t_70)
5. 把a[i]**挖出来**放到a[j]处,j往左移动一格
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711215918712.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTExODIwMw==,size_16,color_FFFFFF,t_70)
7. 此时 **a[i]** 可以存放**比x小**的数(回到循环最开始,判断i是否大于等于j)

结束循环
当循环结束后,a[i]是被挖掉的,用它来存放变量x
一轮循环结束后如下图👇
在这里插入图片描述
最后进入递归,开始处理以i为轴点左区间右区间
递归处理

三、测试代码

#include<iostream> 
using namespace std;
//72 6 57 88 60 42 83 73 48 85
void quickSort(int *arr,int left,int right){
	if(left<right){//判断有无坑位
		int x = arr[left],i = left,j = right;		
		while(i<j){
			while(j>i && arr[j]>=x) j--;//寻找坑位
			//此处一定不要忘了加判断条件if(arr[j]<x)
			//不然又可能是j=i而跳出的循环
			if(arr[j]<x) arr[i++] = arr[j];//填坑		
			while(i<j && arr[i]<=x) i++;//寻找坑位
			if(arr[i]>x) arr[j--] = arr[i];//填坑
		}
		arr[i] = x;//填坑
		quickSort(arr,left,i-1);//处理左区间
		quickSort(arr,i+1,right);//处理右区间					
	}		
}

//测试函数
int main(){
	int arr[10] = {72,6,57,88,60,42,83,73,48,85};
	for(int i = 0; i < 10;i++)
		cout<<arr[i]<<' ';
	cout<<endl;
	quickSort(arr,0,9);
	for(int i = 0; i < 10;i++)
		cout<<arr[i]<<' ';
	cout<<endl;
	return 0;
}

测试结果
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值