算法可视化网站:https://visualgo.net/zh/
快速排序 非递归实现:
void quickSortNonRecursive(vector<int> &nums, int low, int height)
{
stack<int> s;
if (low<height)
{
int mid = getPartition(nums, low, height);
if (mid-1>low)
{
s.push(low);
s.push(mid - 1);
}
if (mid+1<height)
{
s.push(mid + 1);
s.push(height);
}
while (!s.empty())
{
int qHeight = s.top();
s.pop();
int pLow = s.top();
s.pop();
int pqMid = getPartition(nums, pLow, qHeight);
if (pqMid - 1 > pLow)
{
s.push(pLow);
s.push(pqMid - 1);
}
if (pqMid + 1 < qHeight)
{
s.push(pqMid + 1);
s.push(qHeight);
}
}
}
}
递归实现:
size_t getPartition(vector<int> &v,size_t left,size_t right){ // 左闭,右闭
int pivot=v[right]; ; //
int j=left;
for(int i=left;i<right;i++){
if(v[i]<=pivot){ // 遇到一个小于等于中轴 的。就把这个值给v[j].交换出来,j++
int temp=v[j];
v[j]=v[i];
v[i]=temp;
j++;
}
}
// 把v[j]的位置放上pivot,然后v[j]的值交换出来放到右端
v[right]=v[j];
v[j]=pivot;
return j;
}
void quickSort(vector<int> &v,size_t left,size_t right){
if( (!(left<right)) ){
return;
}
size_t mid=getPartition(v,left,right);
quickSort(v,left,mid-1);
quickSort(v,mid+1,right);
}
关于快速排序的优化:
快速排序优化 | PikachuBLOG http://blog.taoaili999.cn/2017/06/29/QuickSort-Optimization/