快速排序

快速排序

算法目的:

​ 一种将无序数组的某个区间范围内的元素排列成有序的。

算法思想:

​ 通过递归与分治思想完成算法
​ 分治:将待排序数组区间不断缩小
​ 递归:对缩小的区间再进行递归排序

算法主要分两部分:
1、先将数组相对数组某一个元素分为两部分(前大后小 --由排序递增递减而定 )
先将对比值取出
设定左右索引 分别从左遍历、从右遍历 (结束条件 : 左索引不小于右索引 )
当其值不满足规定时 交换两值
将对比值放入左右索引的位置
2、将这左右两部分数组,进行递归操作 (递归终止条件为左索引初值不小于右索引初值)

动态演示:

在这里插入图片描述

算法代码:

​ 时间 O( n*log n) 空间(1)

#include<iostream>
#include<vector>
using namespace std;
void Quick_sort(vector<int>& A, int l, int r)
{
	//基线条件
	if (l < r)
	{
		//左右动态索引
		int lindex = l;
		int rindex = r;
		//判断值
		int k = A[r];
		while (lindex < rindex)
		{
			//更新左索引,从左往右找出小于判定值的元素索引
			while (lindex < rindex && A[lindex] >= k)
				lindex++;
			//将其覆盖, 首次覆盖时,覆盖掉的是判定值,之后覆盖的是右索引对应值的副本
			if (lindex < rindex)
				A[rindex--] = A[lindex];
			//更新右索引,从左往右找出小于判定值的元素索引
			while (rindex > lindex && A[rindex] <= k)
				rindex--;
			//将其覆盖,覆盖的是左索引对应值的副本
			if (lindex < rindex)
				A[lindex++] = A[rindex];
		}
		//结束后 左右索引相等 ,且其值是副本,已经存在在之前索引元素中
		//将最开始被覆盖掉的判定值覆盖在此处
		A[rindex] = k;
		//数组被分为两部分
		//将这两部分,分别再次进行快排(即递归)
		Quick_sort(A, l, lindex - 1);
		Quick_sort(A, rindex + 1, r);
	}
}
int main()
{
	vector<int> A = { 1,2,3,5,8,9,6,2,3,1,4,7,8,5 };
	//排序数组中索引 0--9的元素
	Quick_sort(A, 0, 9);
	for (auto a : A)
		cout << a << "  ";
	return 0;
}

​ 备注解释略多…….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值