1098. Insertion or Heap Sort (25)

只有部分正确,苦思凝想也没弄清楚剩下的那两分是什么地方没有考虑到,欢迎各位大神指点!
这里写图片描述

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值