归并+高速分拣

我们都知道STL排序库函数最常用的:sort(v.begin(),biend())。


这是由于在以升序。
我一般不喜欢用一个迭代器,我一般用这种格式。排序的数组,替代指针迭代器。

sort(a,a+n)//升序排序
sort(a,a+n,cpm);
int cmp(type a,type b){//定义的比較格式
    if(code) return 1;
    else return 0;
}

这里我们来手动实现归并排序和快素排序,对于快排排序。我们知道它的执行效率和关键字的A[p]选择有关。我们这里没有考虑,即没有给出随机选择下标的算法。值给出了普通的关键代码。读者能够自己实现随机的快排函数,而归并排序也是仅仅给出了递归的程序。

归并排序:
*是一种递归的排序算法,对于输入数组A[1..n],
*我们能够先排序前半段A[1..n/2],和后半段A[n/2+1..n];
*然后在合并到A[1..n],此时A[1..n]以完毕排序
*算法分析:
*1、分解:将n个元素分成含有n/2个元素的子序列
*2、解决:用合并平排序法对两个子序列递归的排序
*3、合并两个已排序的子序列得到排序结果
*注:对于子序列,其长度为1时。递归结束,单个元素被视为已排序

/**
 *对于排好序的子数组A[l..m]和A[m+1..r]。-->A[l..r](已排序)
 */
void Merge(int *A,int l,int m,int r){//
    int *B=new int[r-l+1];
    int i=l,j=m+1,k=1;
    while(i<=m&&j<=r){
        if(A[i]<=A[j]) B[k++]=A[i++];
        else B[k++]=A[j++];
    }
    //处理尾部
    while(i<=m){
        B[k++]=A[i++];
    }
    while(j<=r){
        B[k++]=A[j++];
    }
    //copy(A,B)
    for(i=l;i<=r;i++){
        A[i]=B[i-l+1];
    }
    delete B;
}
/**
 *归并排序。调用MergeSort(A,1,n);
 */
void MergeSort(int *A,int l,int r){
    if(l<r){
        int m=(l+r)/2;
        MergeSort(A,l,m);//递归左排
        MergeSort(A,m+1,r);//递归右排

        Merge(A,l,m,r);//合并两端字数组
    }
}

高速排序QuickSort(A,1,n);
*算法例如以下:
*1、分解将数组A[p..r]划分为两个字数组A[p..q-1]和A[q+1..r],使得
* A[p..q-1]中的每一个元素都小于等于A[q],而且,小于等于A[q+1..r]。
* 下标q也在这个划分过程中确定,已q为分界线划分
*2、解决递归高速排序,对字数组A[p,q-1]和A[q+1..r],此时A[q]已在排序后的位置
*3、由于两个字数组是就地排序的。不需合并就已经排好序

代码:

/**
 *划分函数
 */
int Quick_Init(int *A,int p,int r){
    //已a[p]作为划分关键字
    int i=p+1,j=r;
    while(true){
        while(A[i]<=A[p]) ++i;
        while(A[j]>A[p]) --j;
        if(j<=i) break;
        else{
            swap(A[i],A[j]);//交换护不满足的两个元素
            ++i; --j;//进行下次推断
        }
    }
    swap(A[p],A[j]);//将关键字与最后一个j的位置交换。此时A[p]已完毕排序
    return j;//返回关键字的位置
}
void QuickSort(int *A,int p,int r){
    if(p<r){//>=2。就进行划分并排序
        int q=Quick_Init(A,p,r);
        QuickSort(A,p,q-1);//左排
        QuickSort(A,q+1,r);//右排
    }
}

測试主程序:
int main()
{
    int A[9]={0,4,8,2,3,5,2,1,6};
    PT(A,8);
    MergeSort(A,1,8);
    QuickSort(A,1,8);
    PT(A,8);
    return 0;
}
注:PT(A,n)的定义为

#define PT(A,n) for(int i=1;i<=n;i++) cout<<A[i]<<" "; cout<<endl;


版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值