快速排序是排序算法中相当重要的排序了。这两天复习了一下,并且尝试着写了一个相对精炼的版本。
首先,如果没有明白快速排序算法的原理的话,建议直接看这个视频。
比文字表达会强上很多。
快速排序原理讲解
那么我们来实现一下快速排序:
有一些细节是我觉得比较重要的
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<<" ";
}
}