思路:
一趟排序:在给定的序列中选定一个基准数,将序列中值比基准数小的元素都移动到其左侧,值比基准数大的都移动到其右侧;然后返回基准数的下标。
快速排序:对序列进行一趟排序,然后按照返回值将序列分为左右两个子序列(递归)。
两个子序列会重复上述过程,然后分为更小的序列,以此类推,直到序列不可再分。
具体实现看以下代码,注释很详细。
代码:
//一趟排序:将序列分为两部分
int myPartition(vector<int> &v,int beg,int end)
{
int left=beg,right=end; //两个伪指针,指向序列的两端
int p=v[beg]; //基准数
//注意此时的v[beg]是基准数,即left所指的位置
while(left<right)
{
//从右往左扫描
while(left<right && v[right]>p) //右边的应该比基准数大
{
--right; //符合条件,指针位移
}
swap(v[left],v[right]); //不符合条件则将其交换到左边去
//交换后,right所指的位置是基准数
//从左往右扫描,原理同上
while(left<right && v[left]<=p)
{
++left;
}
swap(v[left],v[right]);
//交换后,left所指的位置是基准数
}
return left;//返回基准数的下标
}
//快速排序
void QuickSort(vector<int> &v,int beg,int end)
{
if(beg<end) //若不符合则说明此时要处理的元素只有一个,那么就不必执行该函数
{
int pos=myPartition(v,beg,end); //一趟排序
QuickSort(v,beg,pos-1); //对前半部分快速排序
QuickSort(v,pos+1,end); //对后半部分快速排序
}
}