归并法排序

ContractedBlock.gifExpandedBlockStart.gifCode
#include<iostream>
using namespace std;
void main()
{  
    
void Merge(int *A,int p,int q,int r);
    
void MergeSort(int *A,int p, int r);

    
int A[8]={3,41,52,26,38,57,49};
    MergeSort(A,
1,7);
    
for(int i=0;i<7;i++)
    {
        cout
<<A[i]<<" ";

    }
    cout
<<endl;


    
char f;
    cin
>>f;
}
/***A,指向待排序数组的指针,p,r表示爬序是从A中的第p个元素开始,到第r个元素结束,但要注意C++语言的下标是从0开始的*/
void Merge(int *A,int p,int q,int r)
{   
//构建左半部分和右半部分的辅助数组
    int n1=q-p+1;
    
int n2=r-q;
    
int *L=new int[n1];
    
int *R=new int[n2];
    
for (int i=0;i<n1;i++)
    {
        L[i]
=A[p+i-1];
    }
    
for(int j=0;j<n2;j++)
    {
        R[j]
=A[q+j];
    }
    L[n1]
=1000;
    R[n2]
=1000;
    
//由两个已经排好序的子数组,归并成一个排好序的长数组
    int i;
    
int j;
    i
=0;
    j
=0;
    
for(int k=p-1;k<r;k++)
    {
        
if(L[i]<=R[j])
        {
            A[k]
=L[i];
            i
++;
        }
        
else
        {
            A[k]
=R[j];
            j
++;
        }
    }
}
void MergeSort(int *A,int p, int r)
{
    
if(p<r)
    {  
int q;
        q
=(p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q
+1,r);
        Merge(A,p,q,r);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值