</pre><p></p><p><span style="font-size:12px;font-weight: normal;"><span style="color: rgb(255, 102, 0);">第二测试点不通过的原因:</span><span style="background-color: rgb(240, 240, 240);">如果第二个测试点通不过,那就是插入排序的起始排序点错误,下面插入排序的程序里的起始点s应该为2,不是1。</span></span></p><span style="font-size:12px;font-weight: normal;">分析:算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。所以第一次插入排序必需有两个元素参与。若s为1,则第一次插入排序是一个元素,一个元素不能称为有序序列。</span></h1><p></p><pre name="code" class="cpp">#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int main()
{
void gP(double p[],int size,double C[]);
void cP(double p[],int size,double C[]);
int N;
cin>>N;
double A[100],B[100],AA[100];
for(int i=0;i<N;i++)
{
cin>>A[i];
AA[i]=A[i];
}
for(int r=0;r<N;r++)
{
cin>>B[r];
}
cP(A,N,B);
gP(AA,N,B);
cout<<endl;
return 0;
}
void gP(double p[],int size,double C[])
{
int begin=0,end=0,count=0,yes=0;
while(true)
{
begin=0;
count++;
end=pow(2,count);
if(end>size)
{
end=size;
}
sort(p+begin,p+end);
while(end!=size)
{
begin=begin+pow(2,count);
end=end+pow(2,count);
if(begin>size)
{
begin=size;
}
if(end>size)
{
end=size;
}
sort(p+begin,p+end);
if(begin==0 && end==size)
{
break;
}
}
if(yes==1)
{
cout<<"Merge Sort"<<endl;
for(int j=0;j<size;j++)
{
cout<<p[j];
if(j<size-1)
{
cout<<" ";
}
}
break;
}
int r=0;
for(r=0;r<size;r++)
{
if(p[r]!=C[r])
{
break;
}
}
if(r==size)
{
yes=1;
}
if(begin==0 && end==size)
{
break;
}
}
}
void cP(double p[],int size,double C[])
{
for(int s=2;s<=size;s++)//如果第二个测试点通不过,那就是插入排序的起始排序点错误,左边的s应该为2,不是1。
{ //分析:算法从输入序列中取出一元素,将之插入有序序列中正确的位置。
sort(p,p+s); //如此迭代直到全部元素有序。所以第一次插入排序必需有两个元素参与。
int r=0; //若s为1则第一次插入排序是一个元素,一个元素不能称为有序序列。
for(r=0;r<size;r++)
{
if(p[r]!=C[r])
{
break;
}
}
if(r==size)
{
cout<<"Insertion Sort"<<endl;
sort(p,p+s+1);
for(int j=0;j<size;j++)
{
cout<<p[j];
if(j<size-1)
{
cout<<" ";
}
}
break;
}
}
}