只有部分正确,苦思凝想也没弄清楚剩下的那两分是什么地方没有考虑到,欢迎各位大神指点!
#include <iostream>
using namespace std;
#define N 110
int num[N],pSorted[N],n,hnum[N];
bool isSame(int a[],int b[])
{
for(int i=1;i<=n;++i)
{
if( a[i] != b[i] )
return false;
}
return true;
}
void printArray(int num[])
{
for( int i=1;i<=n;++i )
{
if( i == n )
cout<<num[i]<<endl;
else
cout<<num[i]<<" ";
}
}
void insertSorted ( int position )
{
int temp = num[position];
for( int i=position-1;i>=1;--i )
{
if( temp > num[position-1] )
{
break;
}
else if( i == 1 )
{
for( int j = position-1;j>=i;--j )
num[j+1] = num[j];
num[i] = temp;
break;
}
else if( num[i] >num[position] && num[i-1] < num[position] )
{
for( int j=position-1;j>=i;--j )
num[j+1] = num[j];
num[i] = temp;
break;
}
}
}
void downAdjust( int low,int high )
{
int i = low,j=i*2;
while (j<=high)
{
if( (j+1)<=high && hnum[j+1] > hnum[j] ) //找到孩子节点中较大值
{
++j;
}
if( hnum[j] > hnum[i] )
{
//如果孩子节点较大,则把孩子节点和父亲节点交换
int temp = hnum[j]; hnum[j]=hnum[i]; hnum[i]=temp;
//交换之后有可能破坏下层节点的顺序,所以进行检查
i = j;
j = 2*i;
}
else
break;
}
}
void heapSort()
{
for( int i=n/2;i>=1;--i )
downAdjust(i,n);
for( int i=n;i>1;--i )
{
int temp=hnum[1];
hnum[1] = hnum[i];
hnum[i] = temp;
// cout<<"第"<<n-i+1<<"趟:";
// printArray(hnum);
downAdjust(1,i-1); //调整zui
if( isSame(hnum,pSorted) == true )
{
--i;
//进行下一步的"排序"
int temp=hnum[1];
hnum[1] = hnum[i];
hnum[i] = temp;
downAdjust(1,i-1);
cout<<"Heap Sort"<<endl;
printArray(hnum);
break;
}
}
}
int main ()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>num[i];
hnum[i] = num[i];
}
for(int i=1;i<=n;++i)
{
cin>>pSorted[i];
}
int i;
for( i=1;i<=n;++i )
{
insertSorted(i);
// cout<<"第"<<i<<"趟:";
// printArray(num);
if( isSame(num,pSorted) == true ) //如果相等,则为插入排序
{
cout<<"Insertion Sort"<<endl;
if( n == 1 )
;
else
insertSorted(i+1);
printArray(num);
break;
}
}
if( i == n+1 ) //则为zui排序
{
heapSort();
}
return 0;
}
知道错在哪了,插入排序写错了,如下所示:
for( i=2;i<=n;++i ) //插入排序需要进行n-1趟排序,以前i从1开始的
{
insertSorted(i);
// cout<<"第"<<i<<"趟:";
// printArray(num);
if( isSame(num,pSorted) == true ) //如果相等,则为插入排序
{
cout<<"Insertion Sort"<<endl;
if( n == 1 )
;
else
insertSorted(i+1);
printArray(num);
break;
}
}
提交情况:
完整代码如下:
#include <iostream>
using namespace std;
#define N 110
int num[N],pSorted[N],n,hnum[N];
bool isSame(int a[],int b[]) //检查两个数组是否相同
{
for(int i=1;i<=n;++i)
{
if( a[i] != b[i] )
return false;
}
return true;
}
void printArray(int num[]) //输出数组
{
for( int i=1;i<=n;++i )
{
if( i == n )
cout<<num[i]<<endl;
else
cout<<num[i]<<" ";
}
}
void insertSorted ( int position ) //插入排序
{
int temp = num[position];
for( int i=position-1;i>=1;--i ) //这一层循环寻找temp应该放的位置
{
if( temp > num[position-1] ) //若temp(即num[position]) 比它前边的元素大,则直接结束
{
break;
}
else if( i == 1 ) //若比较到第一个位置,则说明带插入元素是最小的,应该放在第一个位置上
{
for( int j = position-1;j>=i;--j )
num[j+1] = num[j];
num[i] = temp;
break;
}
else if( num[i] >num[position] && num[i-1] < num[position] ) //检查待排序元素是否放在中间的某个位置上
{
for( int j=position-1;j>=i;--j )
num[j+1] = num[j];
num[i] = temp;
break;
}
}
}
void downAdjust( int low,int high )
{
int i = low,j=i*2;
while (j<=high)
{
if( (j+1)<=high && hnum[j+1] > hnum[j] ) //找到孩子节点中较大值
{
++j;
}
if( hnum[j] > hnum[i] )
{
//如果孩子节点较大,则把孩子节点和父亲节点交换
int temp = hnum[j]; hnum[j]=hnum[i]; hnum[i]=temp;
//交换之后有可能破坏下层节点的顺序,所以进行检查
i = j;
j = 2*i;
}
else
break;
}
}
void heapSort()
{
for( int i=n/2;i>=1;--i ) //从第n/2个位置开始,建立初始堆
downAdjust(i,n);
for( int i=n;i>1;--i )
{
int temp=hnum[1]; //交换第一个位置和第i个位置的元素
hnum[1] = hnum[i];
hnum[i] = temp;
// cout<<"第"<<n-i+1<<"趟:";
// printArray(hnum);
downAdjust(1,i-1); //交换元素之后调整堆
if( isSame(hnum,pSorted) == true ) //检查是否和部分排完序的数组相等,
{
//若相等,则进行下一次排序并输出
--i;
//进行下一步的"排序"
int temp=hnum[1];
hnum[1] = hnum[i];
hnum[i] = temp;
downAdjust(1,i-1);
cout<<"Heap Sort"<<endl;
printArray(hnum);
break;
}
}
}
int main ()
{
cin>>n;
for(int i=1;i<=n;++i) //输入待排序的数组
{
cin>>num[i]; //num数组用于插入排序
hnum[i] = num[i]; //hnum数组用于堆排序
}
for(int i=1;i<=n;++i)
{
cin>>pSorted[i]; //输入部分排序的数组
}
int i;
for( i=2;i<=n;++i ) //插入排序需要进行n-1趟排序,以前i从1开始的
{
insertSorted(i);
// cout<<"第"<<i<<"趟:";
// printArray(num);
if( isSame(num,pSorted) == true ) //如果相等,则为插入排序
{
cout<<"Insertion Sort"<<endl;
insertSorted(i+1);
printArray(num);
break;
}
}
if( i == n+1 ) //上边的循环结束后,若不是插入排序,则i最后的值为n+1,由此可判断为堆排序
{
heapSort(); //进行堆排序
}
return 0;
}