一、基本原理
基本原理就是分治和递归,参考博客:点击访问
二、c++代码实现
写法一
#include<iostream>
#include<vector>
using namespace std;
class QuickSort
{
private:
// 找到一个位置,这个位置的左边都小于基准,右边都大于基准
int partition(vector<int>& nums, const int low, const int high);
public:
bool quickSort(vector<int>& nums, const int low, const int high)
{
if (low < high)
{
int pivot = this->partition(nums, low, high);
cout << "pivot = " << pivot << endl;
quickSort(nums, low, pivot - 1);
quickSort(nums, pivot + 1, high);
}
return true;
}
};
int main()
{
QuickSort q;
vector<int> nums{ 2,20,2,8,7,11,1,3,3,5,1,4,6,6,6,6 };
q.quickSort(nums, 0, nums.size() - 1);
return 0;
}
int QuickSort::partition(vector<int>& nums, const int low, const int high)
{
int baseNum = nums[low];
int i = low, j = high;
while (i < j)
{
// 从右边找第1个小于baseNum的数
while (i < j)
{
if (nums[j] <= baseNum) break;
else j -= 1;
}
// 替换掉l所在位置的值
nums[i] = nums[j];
//从左边找第一个大于baseNum的数
while (i < j)
{
if (nums[i] > baseNum) break;
else i += 1;
}
// 替换掉r所在位置的值
nums[j] = nums[i];
//cout << "i=" << i << ", j=" << j << endl;
}
// 将重合的位置设置baseNum
nums[i] = baseNum;
for (const auto& item : nums)
{
cout << item << " ";
}
cout << endl;
return i;
}
写法二
#include<vector>
#include<iostream>
using namespace std;
void quickSort(vector<int>& nums, const int st, const int ed)
{
if(st<ed)
{
int left = st, right = ed;
int pivot = nums[left];
while(left < right)
{
while(left<right)
{
// 从右边找小于pivot的值
if(nums[right]<pivot)
{
// 将left处的值置为小值
nums[left] = nums[right];
break;
}
else right-=1;
}
while(left<right)
{
// 从左边找大于pivot的值
if(nums[left]>pivot)
{
nums[right] = nums[left];
break;
}
else left +=1;
}
}
//
if(left!=right)
{
cout<<"[ERROR]: left="<<left<<", right="<<right<<endl;
return;
}
nums[left] = pivot;
//
quickSort(nums, st, left-1); // 注意这里是st,不是0
quickSort(nums, left+1, ed); // 注意这里是ed,不是nums.size()-1
}
}
int main()
{
vector<int> nums{10,3,7,2,1,2,5,8,6,7};
quickSort(nums, 0, nums.size()-1);
for(const int num : nums) cout<<num<<" ";
cout<<endl;
return 0;
}