【1】基本思想
快速排序算法的基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
可能从字面感觉不到他的好处,我们通过例子来学习他的精妙之处;
例如:假设我们要对数组{50,10,90,30,70,40,80,60,20}进行排序
我们先来看代码:
【2】快速排序法的普通版本
int Partition(vector<int>&vec, int low, int high)
{
int pivotkey;
pivotkey = vec[low]; //设立枢纽值为数组的起始位置
while (low < high) //只要high大于low即low和high的位置还没有重合或交换
{
//如果高位的数大于枢纽值则不做改变,高位下标往下减
//否则小于的话将枢纽值和高位的小的数做交换
while (low<high&&vec[high]>pivotkey)
{
high--;
}
swap(pivotkey, vec[high]);
//同理,如果低位的数小于枢纽值则不做改变,低位下标往上加
//否则大于的话讲枢纽值和低位的大的数交换
while (low < high&&vec[low] < pivotkey)
{
low++;
}
swap(pivotkey, vec[low]);
//一直到某个时刻低位不小于高位,则说明已经交换完了
//枢纽值的左边全部小于枢纽值,枢纽值的右边全部大于枢纽值
}
return low; //返回此时枢纽值的位置下标
}
void QuickSort(vector<int>&vec,int low,int high)
{
int pivot; //枢纽位置
if (low < high)
{
pivot = Partition(vec, low, high); //找到枢纽位置
QuickSort(vec, low, pivot - 1); //递归小于枢纽值的部分