PAT甲级-two points类型-1089 Insert or Merge解题思路

1089 Insert or Merge (25 分)

在这里插入图片描述在这里插入图片描述

思路

插入排序和归并排序
归并排序需要用到双指针游走,再借用sort

代码

#include<bits/stdc++.h>
using namespace std;

const int N =105;
int origiin[N],tempOri[N],changed[N];
int n;

bool isSame(int A[],int B[])
{
    
    
    for(int i=0;i<n;i++)
        if(A[i] !=B[i])return false ;
    return true;
}

void showArray(int A[])
{
    
    
    for(int i=0;i<n;i++)
    {
    
    
        cout<<A[i];
        if(i!=n-1)cout<<" ";
    }
    cout<<endl;
}

bool insertSort()   //插入排序
{
    
    
    bool flag = false;
    for(int i =1;i<n;i++)
    {
    
    
        if(i!=1 && isSame(tempOri,changed))
            flag =true;

        int temp = tempOri[i],j=i;
        while(j>0 && tempOri[j-1] > temp )
        {
    
    
            tempOri[j] = tempOri[j-1];
            j--;
        }
        tempOri[j] =temp;
        if(flag)
            return true;      
    }
    return false;
}

void mergeSort() //归并排序
{
    
    
    
    bool flag = false;
    for(int step = 2; step/2 <=n ;step*=2)
    {
    
    
        if(step!=2 && isSame(tempOri,changed))
            flag = true;
        for(int i= 0;i<n;i+=step)
            sort(tempOri+i,tempOri+min(i+step,n));
        if(flag)
           {
    
     showArray(tempOri);
            return ;}
    }
}

int main()
{
    
    
    cin>>n;

    for(int i = 0;i<n;i++)
    {
    
    
        cin>>origiin[i];
        tempOri[i] = origiin[i];
    }

    for(int i = 0;i<n;i++)
        cin>>changed[i];
    
    bool flag = insertSort();
    if(flag){
    
    cout<<"Insertion Sort"<<endl;showArray(tempOri);return 0;}

    for(int i = 0;i<n;i++)
        tempOri[i] = origiin[i];
    cout<<"Merge Sort"<<endl;
    mergeSort();
}

猜你喜欢

转载自blog.csdn.net/weixin_43999137/article/details/114526040