//分治法排序
#include <iostream>
const int MAX=1000;
using namespace std;
void merge_sort(int A[],int p,int r);
void merge(int A[],int p,int q,int r);
int main(int argc, char *argv[])
{
// int A[]={6,5,4,3,2,1};
int n;
cout<<"n="; cin>>n;
int A[n];
for(int i=0;i<n;i++)
{
cin>>A[i];
}
int length=sizeof(A)/sizeof(int);
merge_sort(A,0,length-1);
for(int i=0;i<length;i++)
{
cout<<A[i]<<" ";
}
return 0;
}
void merge_sort(int A[],int p,int r)
{
if(p<r)
{
int q=(p+r)/2;
merge_sort(A,p,q);
merge_sort(A,q+1,r);
merge(A,p,q,r);
}
}
void merge(int A[],int p,int q,int r) //使用哨兵进行归并
{
int n1=q-p+1;
int n2=r-q;
int L[n1+1],R[n2+1];
for(int i=0;i<n1;i++) L[i]=A[p+i];
for(int i=0;i<n2;i++) R[i]=A[q+i+1];
L[n1]=MAX;
R[n2]=MAX;
int i=0,j=0;
for(int k=p;k<r+1;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
}
void merge(int A[],int p,int q,int r) //不使用哨兵进行归并
{
int n1=q-p+1;
int n2=r-q;
int L[n1],R[n2];
for(int i=0;i<n1;i++) L[i]=A[p+i];
for(int i=0;i<n2;i++) R[i]=A[q+i+1];
int i=0,j=0;
int k=p;
while(i<n1 && j<n2)
{
if(L[i]<=R[j])
{
A[k]=L[i];
k++;i++;
}
else
{
A[k]=R[j];
k++;j++;
}
}
if(i==n1)
{
while(j<n2)
{
A[k]=R[j];
k++;j++;
}
}
if(j==n2)
{
while(i<n1)
{
A[k]=L[i];
k++;i++;
}
}
}
分治法排序
最新推荐文章于 2022-09-21 22:24:05 发布