【C++】快速排序

28 篇文章 0 订阅

快速排序是排序算法中相当重要的排序了。这两天复习了一下,并且尝试着写了一个相对精炼的版本。

首先,如果没有明白快速排序算法的原理的话,建议直接看这个视频。
比文字表达会强上很多。
快速排序原理讲解

那么我们来实现一下快速排序:

有一些细节是我觉得比较重要的

1.快速排序算法传参数最好是用引用或者指针来做,不要设定返回值。因为这是一个递归的算法,设定返回值很容易出错。而且我至今没思考出来设定返回值的版本怎么写。

2.关于i和j的判定,由于i= =j的时候是非常多地方的停止条件。所以,与其用i= =j一个一个判断是否结束,不如直接使用(i<j)来进行循环。 这样停下来的时候就暗含了i>=j这个条件了。

3.其它的一些也没有什么特别值得注意的地方了。代码里面使用了直接赋值的方法代替SWAP(),因为这样做效率更高。 并且因为每次赋值之前其实都已经有记录了,所以也不用担心数值丢失

C++代码(附带测试):

#include<iostream>
#include<vector>
using namespace std;

class Solution{
	public:
		void QuickSort(vector<int> &a,int left,int right){
			if(left<right){//判断是否到达递归终点 
				int i = left;//换个地方存储,方便之后递归 
				int j = right;
				int key = a[left];//基准值选择最左边的这个 
				while(i<j)
				{
					while(i<j&&a[j]>=key){//遍历找到第一个小于key值得 
						j--;
					}
					if(i<j){
						a[i] = a[j];
					}
					
					while(i<j&&a[i]<=key){//遍历找到第一个大于key值的 
						i++;
					}
					if(i<j){//确定不是因为i==j而跳出循环 
						a[j] = a[i];
					}
				}
				a[i] = key;
				QuickSort(a,left,i-1);
				QuickSort(a,i+1,right);
			}
		} 
};

int main()
{
	vector<int> a = {5,1,3,7,9,8,4,6,2,10,1};
	cout<<"排序前的数组:"<<endl;
	for(auto &num:a){
		cout<<num<<"  ";
	}
	cout<<endl;
	Solution solution;
	int n = a.size() - 1;
	solution.QuickSort(a,0,n);
	cout<<"排序后的数组:"<<endl;
	for(auto &num:a){
		cout<<num<<"  ";
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值