算法思想
采用分治(Divide and Conquer)思想
实现方法
- 从待排序序列
nums[left,right]
选择一个元素作为pivot
- 对序列进行
partition
操作,形成两个子序列nums[left,pivot-1]
和nums[pivot+1,right]
,并且nums[left,pivot] <= pivot < nums[pivot+1,right]
- 递归的对两个子序列进行以上操作,直至整个序列有序
代码实现
第一种
// 不使用Swap
int partition(vector<int>& nums, int left, int right)
{
int pivot = nums[left];
while(left < right)
{
while(left < right && nums[right] > pivot)
--right;
if(left < right)
nums[left++] = nums[right];
while(left < right && nums[left] <= pivot)
++left;
if(left < right)
nums[right--] = nums[left];
}
nums[left] = pivot
return left;
}
void quickSort(vector<int>& nums, int left ,int right)
{
if(left < right)
{
int pivotPos = partition(nums,left,right);
quickSort(nums,left,pivotPos-1);
quickSort(nums,pivotPos+1,right);
}
}
第二种
// 使用Swap
int partition(vector<int>& nums,int left,int right)
{
int pivot = nums[right];
int pivotPos = left;
for(int i = left; i < right; ++i)
{
if(nums[i] <= pivot)
swap(nums[i],nums[pivotPos++]);
}
swap(nums[pivotPos],nums[right]);
return pivotPos;
}
void quickSort(vector<int>& nums,int left,int right)
{
if(left < right)
{
int pivotPos = partition(nums,left,right);
quickSort(nums,left,pivotPos-1);
quickSort(nums,pivotPos+1,right);
}
}