目录
一、概述
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
扫描二维码关注公众号,回复:
12725240 查看本文章

- 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
- 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
- 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。
二、快速排序实现
1、双指针法实现分割数组
这个双指针法实现分割数组可以解决很多问题,其中有个移0问题(把数组中所有的0都移到后面)也可以用这个方法解决。
int partionArray(std::vector<int> &vecNums, int left, int right,int pvIndex)
{
int pvval = vecNums[pvIndex];//保存基准值
std::swap(vecNums[pvIndex], vecNums[right]);//基准值换到最后
int storeIndex = left;//指向最后一个满足<= pvval索引的下一个位置,双指针中一个指针
for (int i = left; i < right; ++i)//i为双指针的第二个指针
{
if (vecNums[i] <= pvval)
{
std::swap(vecNums[i], vecNums[storeIndex]);
storeIndex++;
}
}
std::swap(vecNums[storeIndex], vecNums[right]);
return storeIndex;
}
2、quicksort实现
有了这个partionArray,quicksort就比较容易写出来了。
void quicksort(std::vector<int> &vecNums, int left, int right)
{
if (right > left)
{
int pvIndex = rand()%(right-left+1) +left;//随机选择基准值
int parIndex = partionArray(vecNums, left, right, pvIndex);
quicksort(vecNums, left, parIndex - 1);
quicksort(vecNums, parIndex + 1, right);
}
}
3、quick sort调用
int main()
{
std::vector<int> vecNums = { 2,4,9,1 };
quicksort(vecNums, 0, vecNums.size() - 1);
return 0;
}
三、总结
这里的关键是partionArray的双指针方法,大家可以重点掌握,这个方法可以用来解决一系列的问题。