快速排序:分割。

快速排序中的分割函数:选取一个枢轴数,再以这个枢轴数为基准,将比枢轴数小的数移动到左边,比枢轴数大的数移动到右边(若是升序排序)。其中,最初提取枢轴数这一步有人用一个很形象的词语来描述:挖坑。


//快速排序:分割
//选取最后一个数为枢轴数,
//然后从左向右扫描
#include<iostream>
using namespace std;
int Partition(int arr[],int low,int high);
int main()
{
    const int length=8;
    int arr[length]={49,38,65,97,76,13,27,49};
    cout<<"The position of privot is : "
        <<Partition(arr,0,length-1)<<endl
        <<"After partition :"<<endl;
    for(int i=0;i<length;i++)
        cout<<arr[i]<<' ';
    return 0;
}
int Partition(int arr[],int low,int high)
 {     /* 从左向右扫描 */
    //隐含条件:j能够走动这一步,说明之前的数
    //都不是(小于枢轴的数),也即能被替换
     const int pivotkey=arr[high];
     int i=low-1,j=low;
     for(;j<high;j++)
     {
         if(arr[j]<pivotkey)
        {
            int tmp=arr[++i];
            arr[i]=arr[j];
            arr[j]=tmp;
        }
     }
    int tmp=arr[i+1];
    arr[i+1]=arr[high];
    arr[high]=tmp;
    return i+1;
 }




//快速排序:分割
//选取第一个数为枢轴数
//然后从两端向中间交替扫描
#include<iostream>
using namespace std;
int Partition(int arr[],int low,int high);
int main()
{
    const int length=8;
    int arr[length]={49,38,65,97,76,13,27,49};
    cout<<"The position of privot is : "
        <<Partition(arr,0,length-1)<<endl;
    return 0;
}
int Partition(int arr[],int low,int high)
 {
    /* 将第一个关键字作为枢轴关键字 */
   const int pivotkey=arr[low];
   while(low< high)
   { /* 从表的两端交替地向中间扫描 */
     while(low<high&&arr[high]>=pivotkey)
       --high;
     arr[low]=arr[high]; //将比枢轴记录小的记录移到低端
     while(low<high&&arr[low]<=pivotkey)
       ++low;
     arr[high]=arr[low]; //将比枢轴记录大的记录移到高端
   }
   arr[low]=pivotkey; //枢轴关键字到位
   return low;
 }


    可以看出,后一种较前一种充分利用了“挖坑”的特性:不用再使用临时变量交换两个变量的值。后一种是

<<《数据结构》算法实现及解析_高一凡编著>>中实现的,不过在这里,简化了例如结构体和类型别名的部分,更好理解吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值