1035. 插入与归并(25)

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入样例1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例2:
10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort
1 2 3 8 4 5 7 9 0 6

/////////

/////////
思路:由于之前写过插入排序算法,这次就直接搬过来用了,但是这样代码比较不简洁。网上代码判断是否是插入排序的思路是:先找出给出的中间序列数组中有序部分的最后一个元素下标i,再从有序部分之后的无序序列中第一个元素开始(++i),与未排序的原数组一 一进行比对,若直到数组最后一个元素都完全相同,则表示,此中间序列为前半部分已排序而后半部分未排序,即为插入排序,使用sort()将原数组的0~i进行排序(此时i是无序序列中第一个元素)。
否则就是归并排序。由于一般的归并排序算法是递归的,因此不能直接输出下一次排序结果,要改进算法。此处参考了网上算法,大意为:将原始数组分成两个两个的小序列,一 一内部排序,同时将非偶数序列的尾巴部分排序;再将两个序列合并(k=k*2,k即为小序列中的元素个数),继续内部排序、序列尾巴排序……直到某一排序后序列与给出的中间序列相同,则再打印、进行一次归并排序并跳出循环。

以下为摘抄的网上关于判断是否是插入排序的算法:

扫描二维码关注公众号,回复: 3631922 查看本文章
  for( i=0; A2[i]<=A2[i+1] && i<N-1; i++ ) ; // i作为有序序列最后一个元素下标退出循环  
  for( j=++i; A1[j]==A2[j] && j<N; j++  ) ;    // A1 A2从 第一个无序的元素开始 逐一比对 
  if( j==N ){// 前半部分有序而后半部分未改动可以确定是插入排序  
       cout<<"Insertion Sort"<<endl;  
       sort( A1, A1+i+1 );  
  }  

//////

//////
以下是我这道题的代码:

#include <iostream>
#include<algorithm> 
using namespace std;

int InsertSort(int oriArray[], int Array[], int n)
{
    int temp;
    int i,j;
    int same=1;

    for(i=1;i<n;i++)
    {
        temp = Array[i];
        j = i-1;
        while(j>=0 && temp<Array[j])
        {
            Array[j+1] = Array[j];
            j = j-1;
        }
        Array[j+1] = temp;
        //////////////////
        if(same==0){
            cout<<"Insertion Sort"<<endl;
            for(int k=0;k<n-1;k++){
                cout<<Array[k]<<" ";
            }
            cout<<Array[n-1];
            return 1;
        }   

        same=0;
        for(int k=0;k<n;k++){
            if(Array[k]!=oriArray[k])
            {
                same=1;
                break;
            }
        }

    }

    return 0;
}


int main()
{
    int n;
    scanf("%d",&n);
    int Array[n];
    int temp[n];
    int oriArray[n];

    for(int i=0;i<n;i++){
        scanf("%d",&Array[i]);
        temp[i] = Array[i];
        //oriArray[i] = Array[i];
    }

    for(int i=0;i<n;i++){
        scanf("%d",&oriArray[i]);
    }

    int flag;
    int f=1;
    int k=1;

    flag = InsertSort(oriArray, temp, n);

    if(flag==0){
        cout<<"Merge Sort"<<endl;
        for(int i=0;i<n;i++)
        {
            temp[i] = Array[i];
        }       
        while(f){
            f=0;
            for(int i=0;i<n;i++){
                if(Array[i]!=oriArray[i]){
                    f=1;
                    break;
                }
            }

            k = k*2;
            for(int i=0;i<n/k;i++){
                sort(Array+i*k,Array+(i+1)*k);
            }
            sort(Array+k*(n/k),Array+n);
        }
        for(int i=0;i<n-1;i++){
            cout<<Array[i]<<" ";
        }
        cout<<Array[n-1];
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/annazzz/article/details/77006895
今日推荐