案例7-1.2 插入排序还是归并排序 (25分)
为了练习打排序算法,我的方法就是把两个排序都模拟出来,一边模拟一边判断序列是哪种排序算法
代码
#include <iostream>
using namespace std;
int n;
int s[102];
int a[102];
int tmp[102];
int tips=0;
void merge(int A[],int TmpA[],int L,int R,int RightEnd){
int LeftEnd=R-1;
int Tmp=L;
int NumElements=RightEnd-L+1;
int flag=1;
while(L<=LeftEnd&&R<=RightEnd){
if(A[L]<=A[R])TmpA[Tmp++]=A[L++];
else TmpA[Tmp++]=A[R++];
}
while (L<=LeftEnd)TmpA[Tmp++]=A[L++];
while (R<=RightEnd)TmpA[Tmp++]=A[R++];
for(int i=0;i<NumElements;i++,RightEnd--)
A[RightEnd]=TmpA[RightEnd];
}
void merge_pass(int A[],int TmpA[],int N,int length)
{
int flag=1;
int i,j;
for(i=0;i<=N-2*length;i+=2*length)
merge(A,TmpA,i,i+length,i+2*length-1);
if(i+length<N)
merge(A,TmpA,i,i+length,N-1);
else
for(j=i;j<N;j++)TmpA[j]=A[j];
if(tips){
for(int i=0;i<n;i++){
if(i!=0)
cout<<' ';
cout<<A[i];
}
tips=0;
}
for(int i=0;i<n;i++)
if(A[i]!=s[i])
flag=0;
if(flag){
cout<<"Merge Sort\n";
tips=1;
}
}
void msort(int A[],int N){
int length=1;
int *TmpA;
TmpA=(int *)malloc(n*sizeof(int));
if(TmpA!= nullptr){
while (length<N){
merge_pass(A,TmpA,N,length);
length*=2;
merge_pass(TmpA,A,N,length);
length*=2;
}
}
}
void insertion(int A[],int N){
int p,i;
int Tmp;
int flag=1;
int mark=0;
for(p=1;p<N;p++){
Tmp=A[p];
for(i=p;i>0&&A[i-1]>Tmp;i--)
A[i]=A[i-1];
A[i]=Tmp;
if(mark){
for(int j=0;j<N;j++){
if(j!=0)
cout<<' ';
cout<<A[j];
}
break;
}
for(int j=0;j<N;j++){
if(A[j]!=s[j])
flag=0;
}
if(flag){
cout<<"Insertion Sort\n";
mark=1;
}
flag=1;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
tmp[i]=a[i];
}
for(int i=0;i<n;i++)
cin>>s[i];
insertion(a,n);
msort(tmp,n);
/*for(int i=0;i<n;i++)
cout<<' '<<a[i];*/
return 0;
}