快速排序(C++)

思路:

一趟排序:在给定的序列中选定一个基准数,将序列中值比基准数小的元素都移动到其左侧,值比基准数大的都移动到其右侧;然后返回基准数的下标。

快速排序:对序列进行一趟排序,然后按照返回值将序列分为左右两个子序列(递归)。

两个子序列会重复上述过程,然后分为更小的序列,以此类推,直到序列不可再分。

具体实现看以下代码,注释很详细。

代码:
//一趟排序:将序列分为两部分
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); //对后半部分快速排序
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值