408复习-数据结构-快速排序

学习目标:

理解和实现快速排序算法


1.快速排序描述

(1)将数组最左边那位作为基准值,需要将这个基准值放在中间位置,在每轮排序后左边的都比基准值小或相等,右边的比基准值大或相等
(2)下一轮需要划分成左右两部分继续排序

2.代码实现

// left和right位需要排序的范围
void run2(vector<int>&arr,int left,int right) {
	if (left < right) {
		int l = left, r = right;
		//先将基准值另外存储
		int temp = arr[l];
		while (l < r) {
			//从右往左找比基准值小就停下来
			while (l < r && arr[r] >= temp) {
				--r;
			}
			arr[l] = arr[r];
			//从左往右找到比基准值大的就停下来
			while (l < r && arr[l] <= temp) {
				++l;
			}
			arr[r] = arr[l];
		}
		//当l和r相等时候,就是基准值应该在的位置
		arr[l] = temp;
		//左右两边继续排序
		run2(arr, left, l - 1);
		run2(arr, l + 1, right);
	}
}


	void test() {
		vector<int>arr{ 9,7,1,3,5,2,6 };
		run2(arr, 0, arr.size() - 1);
		print(arr);
	}

非递归实现

//非递归快速排序实现
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
void run(vector<int>& arr) {
	stack<pair<int, int>>s;
	s.push({ 0,arr.size() - 1 });
	while (!s.empty()) {
		auto it = s.top();
		s.pop();
		int left = it.first;
		int right = it.second;
		if (left >= right) {
			continue;
		}
		int l = left, r = right;
		int temp = arr[left];
		while (left < right) {
			while (left < right && arr[right] >= temp) {
				--right;
			}
			arr[left] = arr[right];
			while (left < right && arr[left] <= temp) {
				++left;
			}
			arr[right] = arr[left];
		}
		arr[left] = temp;
		s.push({ l,left - 1 });
		s.push({ left + 1,r });
	}
}
int main() {
	vector<int>arr{ 9,10,5,2,3,7,4,6,1,8 };
	run(arr);
	for (auto it : arr) {
		cout << it << " ";
	}
}

3.总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mystic Musings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值