首页 > 试题广场 >

Insert or Merge (25)

[编程题]Insert or Merge (25)
  • 热度指数:2719 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration,
insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts
it there. It repeats until no input elements remain.

Merge sort works as follows: Divide the unsorted list into N sublists, each containing 1 element (a list of 1 element is
considered sorted). Then repeatedly merge two adjacent sublists to produce new sorted sublists until there is only 1
sublist remaining.

Now given the initial sequence of integers, together with a sequence which is a result of several iterations of some
sorting method, can you tell which sorting method we are using?

输入描述:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=100). Then in the next line, N integers are 
given as the initial sequence. The last line contains the partially sorted sequence of the N numbers. It is assumed that the target
sequence is always ascending. All the numbers in a line are separated by a space.


输出描述:
For each test case, print in the first line either "Insertion Sort" or "Merge Sort" to indicate the method used to obtain the partial result. 
Then run this method for one more iteration and output in the second line the resulting sequence. It is guaranteed that the answer is
unique for each test case. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the
line.
示例1

输入

10<br/>3 1 2 8 7 5 9 4 6 0<br/>1 2 3 7 8 5 9 4 6 0

输出

Insertion Sort<br/>1 2 3 5 7 8 9 4 6 0
推荐
根据插入排序的特点,先判断迭代后的数组是否为插入排序产生的,
即前K个数组如果是有序的,那么剩余的N-K个数保存原来的顺序和位置。
例如:
原:3 1 28 7 5 9 4 6 0
新:1 2 3 7 8 5 9 4 6 0
在新数组中,{1,2,3}是有序的,{5,9,4,6,0}保持原样,因此它是插入排序后的的部分过程,否则为归并排序的部分过程。

如果是插入排序,接着从5开始调用插排序即可。

如果是归并排序,那么开头2^x个数据是有序,接着把数组每2^(x+1)个数据排序即可。

import java.io.PrintStream;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
    public static Scanner in = new Scanner(System.in);
    public static PrintStream out = System.out;
 
    /**
     * @param array 要排序数组
     * @param len	array[0 - len]是有序的
     * @param val	待插入的值
     */
    public static void insertSort(int[] array,int len, int val){
        int i;
        for(i=0;i<=len;++i){
            if(array[i]>val){
                break;
            }
        }
        while(len>=i){
            array[len+1]=array[len];
            --len;
        }
        array[i]=val;
    }
    /**
     * 判断数组array[left ~ right]是否是有序的
     */
    public static boolean beSorted(int[] array,int left,int right){
        for(int i=left;i<right;++i){
            if(array[i]>array[i+1])
                return false;
        }
        return true;
    }
    
    /**
     * 修改后的归并排序
     * @param array
     * @param left
     * @param right
     */
    public static void mergeSort(int[] array,int left, int right){
        int range = 2;
        // 求出已经排序的范围
        while(beSorted(array, left, left+range-1)){
            range*=2;
        }
        
        for(int i=0;i<=right;i+=range){
            if(i+range<=right){
                Arrays.sort(array,i,i+range);
            }else{
                Arrays.sort(array,i,right+1);
            }
        }
         
    }
    public static void main(String[] args) throws ParseException {
        int N = in.nextInt();
        int[] array = new int[N];
        int[] sorted = new int[N];
         
        int i,index;
        for(i=0;i<N;++i)
            array[i]=in.nextInt();
        for(i=0;i<N;++i)
            sorted[i]=in.nextInt();
        for(i=0;i<N-1;++i){
            if(sorted[i]>sorted[i+1]){
                break;
            }
        }
        index=i;
        for(i+=1;i<N;++i){
            if(array[i]!=sorted[i]){
                break;
            }
        }
        if(i>=N){
            out.println("Insertion Sort");
            insertSort(sorted, index, sorted[index+1]);
            for(i=0;i<N-1;++i)
                out.print(sorted[i]+" ");
            out.println(sorted[N-1]);
            
        }else{
            out.println("Merge Sort");
            mergeSort(sorted, 0,sorted.length-1);
            for(i=0;i<N-1;++i)
                out.print(sorted[i]+" ");
            out.println(sorted[N-1]);
        }
    }
}

编辑于 2015-08-18 22:53:24 回复(0)
#include <algorithm>
#include <iostream>
using namespace std;
int n,a[110],s[110];
void mergesort(int (&a)[110],int s[],int n){   //注意引用数组的写法
    int step=1,flag=1;
    while(flag){                               //flag表示数组的中间步骤是否与中间数组相同
        flag=0;
        for(int i=0;i<n;i++){
            if(a[i]!=s[i])
                flag=1;
        }
        step*=2;                              //不断的归并排序,直到与中间数组相同,再排序一次并退出
        for(int i=0;i<n;i+=step)
            sort(a+i,a+min(i+step,n));        //不像插入排序一样只用一次处理。是因为判断归并的有序 区间大小比较复杂
    }
}
int main(){
    int i,j;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    for(i=0;i<n;i++)
        cin>>s[i];
    for (i = 0; i < n - 1 && s[i] <= s[i + 1]; i++);  //找出中间数组的有序部分
    for (j = i + 1; a[j] == s[j] && j < n; j++);      //判断排序类型
    if(j==n){
        cout<<"Insertion Sort"<<'\n'; 
        sort(a,a+i+2);                      //直接用sort函数代替插入排序(注意下标)       
    }
    else{
        cout<<"Merge Sort"<<'\n';
        mergesort(a,s,n);
    }
    for(int i=0;i<n;i++){
        cout<<a[i];
        if(i!=n-1) cout<<" ";
    }
    return 0;
}

发表于 2018-02-11 01:44:26 回复(0)
插入用例过不了的一个: 
10 
3 1 2 8 7 5 9 4 6 0 
1 2 3 5 7 8 9 4 6 0
Insertion Sort 
1 2 3 4 5 7 8 9 6 0 
因为等于中间序列后,再迭代一次,是“9”这个数插入序列,它没动。。。
写个while直到整个序列变动。。。
编辑于 2017-03-13 21:42:01 回复(0)


测试点4坑啊,pat上过了,牛客上不给过,而且原题意也没要求说每一次迭代的结果不同才算一次迭代,还好这题n比较小,稍微改动就过了,只不过牛客改变题意,自己的测试用例真的不敢恭维
测试用例:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 5 7 8 9 4 6 0

对应输出应该为:

Insertion Sort
1 2 3 4 5 7 8 9 6 0

你的输出为:

Insertion Sort
1 2 3 5 7 8 9 4 6 0
//PAT过,牛客没过
#define min(a,b) (((a)<(b))?(a):(b))
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=110;

int n;
int initseq[MAXN],bkupseq[MAXN],seq[MAXN];
bool seqcmp(int a[],int b[]){
    for(int i=0;i<n;++i)
        if(a[i]!=b[i]) return false;
    return true;
}
int insertsort(int a[]){
    int i;
    for(i=1;i<n;++i){
        for(int j=i-1;j>=0;--j)
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]);
        if(seqcmp(a,seq)) return i;
    }
    return 0;
}
void insertsortnext(int a[],int i){
    for(int j=i++;j>=0;--j)
        if(a[j]>a[j+1])
            swap(a[j],a[j+1]);
}
void mergesort(int a[]){
    bool flag=false;
    for(int i=2;i<=n;i*=2){
        if(seqcmp(bkupseq,seq)) flag=true;
        for(int j=0;j<n;j+=i)
            sort(bkupseq+j,min(bkupseq+j+i,bkupseq+n));
        if(flag) return;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0,t;i<n;++i){
        scanf("%d",&t);
        bkupseq[i]=initseq[i]=t;
    }
    for(int i=0;i<n;++i)
        scanf("%d",seq+i);
    int p;
    if(p=insertsort(initseq)){
        insertsortnext(seq,p);
        printf("%s","Insertion Sort");
        for(int i=0;i<n;++i)
            printf("%c%d",i?' ':'\n',seq[i]);
    }else{
        printf("%s","Merge Sort");
        mergesort(bkupseq);
        for(int i=0;i<n;++i)
            printf("%c%d",i?' ':'\n',bkupseq[i]);
    }
    return 0;
}
//PAT、牛客都过了
#define min(a,b) (((a)<(b))?(a):(b))
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=110;
int n;
int initseq[MAXN],bkupseq[MAXN],seq[MAXN],tmp[MAXN];
bool seqcmp(int a[],int b[]){
    for(int i=0;i<n;++i)
        if(a[i]!=b[i]) return false;
    return true;
}
int insertsort(int a[]){
    int i;
    for(i=1;i<n;++i){
        for(int j=i-1;j>=0;--j)
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]);
        if(seqcmp(a,seq)) return i;
    }
    return 0;
}
void insertsortnext(int a[],int i){
    for(;i<n;++i){
        for(int j=i++;j>=0;--j)
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]);
        if(!seqcmp(a,tmp)) return;
    }
}
void mergesort(int a[]){
    bool flag=false;
    for(int i=2;i<=n;i*=2){
        if(seqcmp(bkupseq,seq)) flag=true;
        for(int j=0;j<n;j+=i)
            sort(bkupseq+j,min(bkupseq+j+i,bkupseq+n));
        if(flag) return;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0,t;i<n;++i){
        scanf("%d",&t);
        bkupseq[i]=initseq[i]=t;
    }
    for(int i=0,t;i<n;++i){
        scanf("%d",&t);
        tmp[i]=seq[i]=t;
    }
    int p;
    if(p=insertsort(initseq)){
        insertsortnext(seq,p);
        printf("%s","Insertion Sort");
        for(int i=0;i<n;++i)
            printf("%c%d",i?' ':'\n',seq[i]);
    }else{
        printf("%s","Merge Sort");
        mergesort(bkupseq);
        for(int i=0;i<n;++i)
            printf("%c%d",i?' ':'\n',bkupseq[i]);
    }
    return 0;
}

发表于 2018-08-08 17:45:05 回复(0)
终于刷完63条题了,填个楼纪念一下。🤩
#include<iostream>
(720)#include<vector>
#include<algorithm>
(831)#define ARRAY vector<int> //下标从0开始有效
using namespace std;

void oneMoreSort(ARRAY &ary){
	int lap = 2;
	bool isSort = true;
	for (lap = 2; lap <= ary.size() && isSort; lap *= 2) {
		for (int i = 0; i < ary.size() / lap && isSort; i++){
			for (int i = 0; i < ary.size() && isSort; i += lap){
			  isSort = is_sorted(ary.begin() + i, ary.begin() + (i + lap>ary.size() ? ary.size() : i + lap));
			}
		}
		if (!isSort){	//在lap最小的一层迭代一轮,然后结束
			for (int i = 0; i < ary.size() ; i+=lap){
				sort(ary.begin()+i, ary.begin()+ (i+lap>ary.size()? ary.size() : i+lap));
			}
		}
	}
	return;
}

int main(){
	int numbers;
	scanf("%d", &numbers);
	ARRAY before(numbers), after(numbers);
	for (int i = 0; i < numbers; i++) {
		cin >> before[i];
	}
	for (int i = 0; i < numbers; i++) {
		cin >> after[i];
	}
	int diffIdx = 0, sameIdx =numbers;
	for (diffIdx = 0; diffIdx + 1 < numbers && after[diffIdx+1] > after[diffIdx]; diffIdx++);
	for (sameIdx = numbers - 1; sameIdx >= 0 && before[sameIdx] == after[sameIdx]; sameIdx--);
	if (diffIdx >= sameIdx) {	//是插入排序
		cout << "Insertion Sort" <<endl;
		sort(after.begin(), after.begin() + diffIdx + 2);
	}
	else{	//是归并排序
		cout << "Merge Sort" << endl;;
		oneMoreSort(after);
	}
	for (int i = 0; i < numbers; i++) {
		cout << after[i] << (i + 1 == numbers ? "\n" : " ");
	}
	return 0;
}


发表于 2020-03-05 15:50:19 回复(0)
/*先判断是否是归并排序
    *枚举间隔,看间隔内的数是否是有序且和原序列的数相同;
    *只有此间隔下所有集合有序且与原数组元素相符才能判断是归并;
    *若是归并,则扩大间隔,每个间隔内排序即得下步;
    *若是插入,则直接寻址不符合有序的一个元素向前插入到适合位置即可。
*/
#include <bits/stdc++.h>
using namespace std;
const int AX = 1e2 + 66 ;
int n ;
map<int,int>mp;
int a[AX];
int b[AX];
int ans ; 
bool check_sort( int l , int r ){
	int ans = 0 ;
	mp.clear() ; 
	for( int i = l ; i <= r ; i++ ){
		mp[a[i]] ++ ;
	}
	for( int i = l ; i < r ; i++ ){
		mp[b[i]] -- ; 
		if( b[i+1] < b[i] ) return false ;
	}mp[b[r]] -- ;
	for( auto i : mp ){
		if( i.second ) return false ; 
	}
	return true ; 
}
int check_merge(){
	for( int d = 2 ; d <= n ; d *= 2 ){
		int f = 1 ; 
		for( int i = 0 ; i < n ; i += d ){
			if( !check_sort( i , min( n - 1 , i + d - 1 ) ) ){
				f = 0 ; break ;  
			}
		}
		if( f ) { ans = d ; return true ; }
	}
	return false ; 
}
int main() {
	scanf("%d",&n);
	for( int i = 0 ; i < n ; i++ ) {
		scanf("%d",&a[i]);
	}
	for( int i = 0 ; i < n ; i++ ) {
		scanf("%d",&b[i]);
	}
	if( check_merge()  ) {
		printf("Merge Sort\n");
		ans *= 2 ; 
		for( int i = 0 ; i < n ; i += ans ){
			sort( b + i , b + min( n , i + ans ) );
		}
	}else{
		printf("Insertion Sort\n");
		for( int i = 1 ; i < n ; i++ ){
			if( b[i] < b[i-1] ){
				while(b[i] < b[i-1]){
					swap( b[i] , b[i-1] );
					i -- ; 
				}
				break ;
			}
		}
	}
	for( int i = 0 ; i < n ; i++ ){
		printf("%d",b[i]);
		if( i != n - 1 ) printf(" ");
	}
	return 0 ;
}

发表于 2020-02-28 09:33:00 回复(0)
通不过的一例解决办法用😅做标记帮大家标了出来。
#include<bits/stdc++.h>
using namespace std;

const int Max=110;
int a[Max],b[Max],c[Max];
int n;

bool cmp(int* b,int* c) {
	for(int i=0; i<n; i++) {
		if(b[i]!=c[i]) {
			return 0;
		}
	}
	return 1;
}

void Printf(int* b) {
	for(int i=0; i<n; i++) {
		cout<<b[i];
		if(i<n-1) cout<<" ";
	}
	cout<<endl;
	return ;
}

bool Insertsort() {
	bool flag=0;
	for(int i=1; i<n; i++) {
		if(i!=1&&cmp(b,c)) {
			flag=1;
		}
		int temp=b[i],j=i;
		while(j>0&&b[j-1]>temp) {
			b[j]=b[j-1];
			j--;
		}
		b[j]=temp;
      😅if(b[i]==temp){
            continue;
        }😅
		if(flag) {
			return 1;
		}
	}
	return 0;
}

void Mergesort() {
	bool flag=0;
	for(int step=2; step<=n; step*=2) {
		if(step!=2&&cmp(a,c)) {
			flag=1;
		}
		for(int i=0; i<n; i+=step) {
			sort(a+i,a+min(i+step,n));
		}
		if(flag) {
			Printf(a);
			return ;
		}
	}
}

int main() {
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
		b[i]=a[i];
	}
	for(int i=0; i<n; i++) {
		cin>>c[i];
	}
	if(Insertsort()) {
		cout<<"Insertion Sort"<<endl;
		Printf(b);
	} else {
		cout<<"Merge Sort"<<endl;
		Mergesort();
	}
	return 0;
}

发表于 2022-11-13 22:52:36 回复(0)
a,i = int(input()),0
b = list(map(int,input().split()))
c = list(map(int,input().split()))
while c[i] <= c[i + 1]:
    i += 1
if c[i + 1:] == b[i + 1:]:
    print("Insertion Sort")
    print(' '.join(map(str,sorted(c[:i + 2]) + c[i + 2:])))
else:
    print("Merge Sort")
    d,j = c.copy(),2
    while d == c:
        for i in range(a // j + 2):
            c[i * j:(i + 1) * j] = sorted(c[i * j:(i + 1) * j])
        j *= 2
    print(' '.join(map(str,c)))

发表于 2020-07-23 10:24:52 回复(0)
!!!!
//1.开始写个二路归并,最后发现是n路归并。。。
//2.归并排序中是这一轮合并结束才算一次新的迭代,而不是局部排一次序就认为是一次新的迭代。
//3. 这个题有要求输出的结果不能和上一次迭代相同。

#include<iostream>
(720)#include<vector>
#include<algorithm>
using namespace std;
int n, x;
vector<int>initial;
vector<int>middle;
bool mergeflag = false;
void InsertSort() {
	vector<int>tmp=initial;
	vector<int>tmpvector;
	bool flag = false;
	for (int i = 0; i < n; i++) {
		int j = 0;
		while (tmp[j] < initial[i] && j < i) {
			j++;
		}
		tmp.erase(tmp.begin() + i, tmp.begin() + i + 1);
		tmp.insert(tmp.begin() + j, initial[i]);
		if (flag&&tmpvector!=tmp) {
			for (int j = 0; j < n; j++) {
				if (j) { cout << " "; }
				cout << tmp[j];
			}
			exit(0);
		}
		if (tmp == middle&&!flag) {
			printf("Insertion Sort\n");
			tmpvector = tmp;
			flag = true;
		}
	}
}
void merge(int a, int b, int c, int d) {// 1  3  8   2  5  6
	int i = a, j = c;
	vector<int>tmp;
	while (i <= b && j <= d) {
		if (initial[i] < initial[j]) {
			tmp.push_back(initial[i]);
			i++;
		}
		else {
			tmp.push_back(initial[j]);
			j++;
		}
	}
	while (i <= b) {
		tmp.push_back(initial[i]);
		i++;
	}
	while (j <= d) {
		tmp.push_back(initial[j]);
		j++;
	}
	int k = a;
	for (i = 0; i < tmp.size(); i++) {
		initial[k] = tmp[i];
		k++;
	}
}
/*void MergeSort(int i, int j) {
	if (j == i) { return; }
	int tmp = (i + j) / 2;
	MergeSort(i, tmp);
	MergeSort(tmp + 1, j);
	merge(i, tmp, tmp + 1, j);
	if (mergeflag) {
		for (int j = 0; j < n; j++) {
			if (j) { cout << " "; }
			cout << initial[j];
		}
		exit(0);
	}
	if (initial == middle) {
		printf("Merge Sort\n");
		mergeflag = true;
	}
}*/
void MergeSort(int left,int n) {//j为数组长度
	int num = 2;
	int i;
	vector<int>tmpvector;
	while (num <= n) {
		for (i = left; i <= n; i = i + num) {
			int tmp = i + num > n ? n : i + num;
			sort(initial.begin() + i, initial.begin() + tmp);
		}
			if (mergeflag&&tmpvector!=initial) {
				for (int j = 0; j < n; j++) {
					if (j) { cout << " "; }
					cout << initial[j];
				}
				exit(0);
			}
			if (initial == middle&&!mergeflag) {
				printf("Merge Sort\n");
				tmpvector = initial;
				mergeflag = true;
			}
			num *= 2;
		}
	//sort(initial.begin(), initial.end());
}
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> x;
		initial.push_back(x);
	}
	for (int i = 0; i < n; i++) {
		cin >> x;
		middle.push_back(x);
	}
	InsertSort();
	MergeSort(0,n);
}



发表于 2020-03-21 12:09:16 回复(0)
#include <bits/stdc++.h>
using namespace std;
constintmaxn = 1e2 + 5;
vector<int> init;
vector<int> statu;
vector<int> insert;
vector<int> merges;
inta[maxn];
bool ins() {
    bool flag = false;
    inti;
    insert = init;
    for(i = 1; i < insert.size(); ++i) {
        intval = insert[i];
        insert.erase(insert.begin() + i);
        auto p = lower_bound(insert.begin(), insert.begin() + i, val);
        insert.insert(p, val);
        if(insert == statu) {
            flag = true;
            break;
        }
    }
    if(flag) {
        cout << "Insertion Sort"<< endl;
        while(insert == statu) {
            i++;
            intval = insert[i];
            insert.erase(insert.begin() + i);
            auto p = lower_bound(insert.begin(), insert.begin() + i, val);
            insert.insert(p, val);
        }
        for(inti = 0; i < insert.size(); ++i) {
            if(i)
                cout << " ";
            cout << insert[i];
        }
        cout << endl;
        returntrue;   
    }
    returnfalse;
}
voiddomerge(intlef, intmid, intrig) {
    intl = lef, r = mid;
    intpos = lef;
    while(l < mid && r <= rig) {
        if(merges[l] < merges[r])
            a[pos++] = merges[l++];
        else
            a[pos++] = merges[r++];
    }
    while(l < mid)
        a[pos++] = merges[l++];
    while(r <= rig)
        a[pos++] = merges[r++];
    for(inti = lef; i <= rig; ++i)
        merges[i] = a[i];
}
voidmer() {
    merges = init;
    intsz = 1;
    for(sz = 1; sz < merges.size(); sz *= 2) {
        inti;
        for(i = 0; i + sz * 2- 1< merges.size(); i += sz * 2) {
            domerge(i, i + sz, i + sz * 2- 1);
        }
        if(i + sz < merges.size())
            domerge(i, i + sz, merges.size() - 1);
        if(merges == statu) {
            break;
        }
    }
    cout << "Merge Sort"<< endl;
    sz *= 2;
    inti;
    for(i = 0; i + sz * 2- 1< merges.size(); i += sz * 2) {
        domerge(i, i + sz, i + sz * 2- 1);
    }
    if(i + sz < merges.size())
        domerge(i, i + sz, merges.size() - 1);
    for(inti = 0; i < merges.size(); ++i) {
        if(i)
            cout << " ";
        cout << merges[i];
    }
    cout << endl;
}
intmain() {
    std::ios::sync_with_stdio(false);
    intn;
    cin >> n;
    init.resize(n);
    statu.resize(n);
    for(inti = 0; i < n; ++i)
        cin >> init[i];
    for(inti = 0; i < n; ++i)
        cin >> statu[i];
    if(!ins()) {
        mer();
    }
    return0;
}

发表于 2019-02-02 13:18:58 回复(0)
def merge(a):
    if len(a)==1:
        return
    con = len(a)//2
    temp =[]
    telst = []
    for i in range(0,con):
        tem = a[2*i]+a[2*i+1]
        tem.sort()
        telst.append(tem)
        temp = temp+tem
    for i in a[2*(con-1)+2:]:
        temp = temp+i
    if a[2*(con-1)+2:]:
        telst.extend(a[2*(con-1)+2:])
    merger.append(temp)
    merge(telst)

def insert(a):
    tem = []
    for i in range(0,len(a)):
        tem = tem + [a[i]]
        tem.sort()
        if tem+a[i+1:] not in inser:
            inser.append(tem+a[i+1:]) 
inser,merger = [],[]
n = input()
n = int(n)
lst = list(map(int,input().split()))
b = list(map(int,input().split()))
insert(lst)
merge([[i] for i in lst])
if b in inser:
    print("Insertion Sort")
    print(' '.join(map(str,inser[inser.index(b)+1])))
else:
    print("Merge Sort")
    print(' '.join(map(str,merger[merger.index(b)+1])))

没有把insertion和merge写出来,模拟了该过程。
发表于 2018-12-08 00:04:55 回复(0)
坑。。。输出下一次的迭代,不是只迭代一次,而是要和上一次完全不同!
发表于 2018-07-31 10:48:17 回复(0)
#include <stdio.h>

#include <stdlib.h>
int insert(int *a,int *b,int n);
void quick(int *count,int low,int high);
int main ()
{
    int n,i,j;
    int *a=(int *)malloc(sizeof(int )*n);
    int *b=(int *)malloc(sizeof(int )*n);
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
    }
    if(insert(a,b,n))
    {
        printf("Insertion Sort\n");
        int point=insert(a,b,n);
        for(i=0;i<n;i++)
        {
            if(b[i]>b[point])
            break;
        }
        int x=b[point];
        for(j=point;j>i;j--)
        {
            b[j]=b[j-1];
        }
        b[i]=x;
        for(i=0;i<n;i++)
        if(i==0)
        printf("%d",b[i]);
        else 
        printf(" %d",b[i]);
    }
    else 
    {
        printf("Merge Sort\n");
        for(i=0;i<n;i++)
        {
            if(b[i]>b[i+1])
            break;
        }
        int l;
        if(i==1)
        l=4;
        else if(i%2==1)
        l=2*(i+1);
        else 
        l=i*4;
        for(i=0;i<n;i+=l)
        {
            quick(b,i,i+l-1);
        } 
        if(l*2>n)
        quick(b,0,n);
        for(i=0;i<n;i++)
        {
            if(i==0)
            printf("%d",b[i]);
            else 
            printf(" %d",b[i]);
         } 
    }
}
int insert(int *a,int *b,int n)
{
    int i,j;
    for(i=0;;i++)
    {
        if(b[i]>b[i+1])
        break;
    }
    j=i+1;
    for(i=i+1;i<n;i++)
    {
        if(a[i]!=b[i])
        return 0;
    }
    return j;
}
void quick(int *count,int low,int high)
{
    int i=low;
    int j =high;
    int temp = count[low];
    if(high > low )
    {
        while (j>i)
        {
            while(count[j] >=temp&&j>i)
            j--;
            count[i] =count[j];
            while (count[i]<=temp&&j>i )
            i++;
            count [j]=count[i];
        }
        count[i]=temp;
        quick(count,low,i);
        quick(count,j+1,high);
    }
}
请大佬帮忙看下 我这个
链接:https://www.nowcoder.com/questionTerminal/fd3c5d72751b43b2b95717ed4534cbe6
来源:牛客网
测试用例:
9
3 1 2 8 7 5 9 4 6
1 2 3 7 8 5 9 4 6
对应输出应该为:
Insertion Sort
1 2 3 5 7 8 9 4 6
你的输出为:
Merge Sort
Devc上运行是没错的 ....  不知道为什么错了在这
发表于 2018-07-27 19:36:30 回复(0)
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 110
int n,original[maxn],target[maxn];
bool merge_sort(int a[]){
	int num=2;
	bool flag=false;
	while(1){
		int left=0;
		for(;left<n;left+=num){
			int end=left+num;
			end=end>n?n:end;
			sort(a+left,a+end);
		}
		if(flag){
			printf("Merge Sort\n");
			for(int i=0;i<n;i++){
				printf("%d",a[i]);
				if(i<n-1)printf(" ");
			}
			break;
		}
		int k;
		for(k=0;k<n;k++)if(a[k]!=target[k]){
			break;
		}
		if(k>=n)flag=true;
		if(num>n)break;
		num*=2;
	}
	return flag;
}
void insertion_sort(int b[]){
	bool flag=false;
	for(int num=2;num<=n;num++){//num从2开始,否则测试点2的数据通不过
		sort(b,b+num);
		if(flag){
			printf("Insertion Sort\n");
			for(int i=0;i<n;i++){
				printf("%d",b[i]);
				if(i<n-1)printf(" ");
			}
			break;
		}
		int k;
		for(k=0;k<n;k++)if(b[k]!=target[k]){
			break;
		}
		if(k>=n)flag=true;
	}
}
int main(){
	//freopen("A1089.txt","r",stdin);
	int a[maxn],b[maxn];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&original[i]);
		a[i]=original[i];
		b[i]=original[i];
	}
	for(int i=0;i<n;i++)scanf("%d",&target[i]);
	if(merge_sort(a))return 0;
	insertion_sort(b);
	return 0;
}
对比的数列为排序过程中的中间序列,不会出现初始序列的情况
考虑
//input
4
3 4 2 1
3 4 2 1
//output
Insertion Sort
2 3 4 1
发表于 2017-08-21 11:33:37 回复(0)
public class Main{
	public static void main(String[] args){
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		int[] pre = new int[n];
		int[] cur = new int[n];
		for(int i=0; i<n; ++i)
			pre[i] = s.nextInt();
		for(int i=0; i<n; ++i)
			cur[i] = s.nextInt();
		int index =0;
		String str = "Insertion";
		for(int i=1; i<n; ++i){
			if(cur[i-1]>cur[i]){
				index = i;
			for(;i<n; ++i){
				if(pre[i]!=cur[i]){
					str = "Merge";
				}
			}
			}
			if("Merge".equals(str))
				break;			
		}
		if("Insertion".equals(str)){
			System.out.println(str+" Sort");
			int num = cur[index];
			int flag =1;
			for(int i=index-1; i>-1; --i){
				if(num>cur[i]){
					cur[i+1] = num;
					flag = 0;
					break;
				}else{
					cur[i+1] = cur[i];
				}
			}
			if(flag!=0){
				cur[0] = num;
			}
		}else{
			System.out.println("Merge Sort");
			index = index*2;
			for(int i=0; i<n; i+=index){
				int end = i+index>n ? n :(i+index);
				Arrays.sort(cur,i,end);
			}
		}
		for(int i=0; i<n; ++i){
			if(i==n-1)
				System.out.print(cur[i]);
			else
				System.out.print(cur[i]+" ");
		}
			
	}
}


发表于 2017-03-29 23:39:42 回复(0)
#include <stdio.h>
#include <algorithm>

using namespace std;

int buf1[110];
int buf2[110];
int temp[110];

bool IsSame(int a[],int b[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(a[i] != b[i]) return false;
	}
	
	return true;
}

int InsertSort(int a[],int n)
{
	int i,j,tmp;
	int flag = 0;
	for(i=1;i<n;i++)
	{
		if(a[i] < a[i-1])
		{
			if(IsSame(a,buf2,n))
			{
				flag = 1;
			}
			
			tmp = a[i];
			for(j=i-1;a[j]>tmp && j>=0;j--)
			{
				a[j+1] = a[j];
			}
			
			a[j+1] = tmp;
		}
		
		if(flag == 1)
		{
			return 1; //is insertsort
		}
	}
	
	return 0;
}

void output(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
    {
    	printf("%d",a[i]);
    	if(i != n-1)
    	{
    		printf(" ");
    	}
    }
    printf("\n");
}

void MergeSort(int a[],int n)
{
	int step,i,j;
	int flag = 0;
	for(step=2;step/2<=n;step*=2)
	{
		if(IsSame(a,buf2,n))
		{
			flag = 1;
		}
		for(i=0;i<n;i+=step)
		{
			sort(a+i,a+min(i+step,n));
		}
		
		
		if(flag == 1) return;
	}
}

int main()
{
#if 0 
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);    
#endif    

    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    	scanf("%d",&buf1[i]);
    	temp[i] = buf1[i];
    }
    
    for(i=0;i<n;i++)
    {
    	scanf("%d",&buf2[i]);
    }
    
    if(InsertSort(buf1,n) == 1)
	{
		printf("Insertion Sort\n");
		output(buf1,n);
	}
	else //merge sort
	{
		MergeSort(temp,n);
		printf("Merge Sort\n");
		output(temp,n);
	}

    return 0;
} 


发表于 2017-03-16 18:21:32 回复(0)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <vector>
#include <string>
#include <set>
#include <string>
#include <functional>
#include <algorithm>
#include <assert.h>
#include <fstream>
#include <map>
#include <stack>

using namespace std;

int get_i(int x)
{
	int t = 32;
	while (x<0)
	{
		t--; x <<= 1;
	}
	return t;
}
typedef vector<int>::iterator it;
void merge_sort(it b, it e, int n)
{
	while (true)
	{
		if (e - b < n) break;
		it p1 = b, p2 = b + n;
		int i = 0;
		auto l = e;
		if (e - b > n + n)
			l = b + n + n;

		inplace_merge(b, b + n, l);
		b = l;
	}
}
int main()
{
#ifdef _DEBUG
	freopen("data.txt", "r", stdin);
#endif // _DEBUG
	int n;
	cin >> n;
	vector<int> src(n), s(n);
	for (int i = 0; i < n; i++)
		cin >> src[i];
	for (int i = 0; i < n; i++)
		cin >> s[i];
	int j = n - 1;
	for (; j>0 && src[j] == s[j]; j--);


	map<int, int> index;
	int r;
	unsigned int c;
	if (j < n - 1)
	{
		int i = 1;
		for (; i<n&&s[i] >= s[i - 1]; i++);
		assert(i < n);
		vector<int> a(src.begin() + i, src.end()),
			b(s.begin() + i, s.end());
		if (a == b)
		{
			cout << "Insertion Sort" << endl;
			sort(s.begin(), s.begin() + i + 1);
			goto PRINT;
		}
	}


	for (int i = 0; i < n; i++)
		index[src[i]] = i;

	c = 0;
	for (int i = 0; i < n; i++)
	{
		unsigned int  a = (i), b = (index[s[i]]);
		c = max((a^b), c);
	}
	r = get_i(static_cast<unsigned int> (~c));
	merge_sort(s.begin(), s.end(), pow(2, r));
	cout << "Merge Sort" << endl;

PRINT:
	int i = 0;
	for (; i < n - 1; i++)
	{
		cout << s[i] << " ";
	}
	cout << s[i] << endl;
	return 0;
}

发表于 2017-03-05 09:02:30 回复(0)
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
intmain(){
    intN,i,j;
//  freopen("input.txt","r",stdin);
    while(scanf("%d",&N)!=EOF){
        vector<int> a1(N),a2(N);
        for(i=0;i<N;i++) scanf("%d",&a1[i]);
        for(i=0;i<N;i++) scanf("%d",&a2[i]);
        for(i=1;i<a2.size();i++)
            if(a2[i]-a2[i-1]<0)
                break;
        intflag=1;
        for(j=i;j<a2.size();j++)
            if(a1[j]!=a2[j]){
                flag=0;
                break;
            }
            if(flag==1){
                printf("Insertion Sort\n");
                sort(a2.begin(),a2.begin()+i+1);
                for(i=0;i<a2.size()-1;i++)
                    printf("%d ",a2[i]);
                printf("%d\n",a2[i]);
            }else{
                printf("Merge Sort\n");
                if(i%2!=0) i--;
                i*=2;
                for(j=0;j+i<=a2.size();j+=i) sort(a2.begin()+j,a2.begin()+j+i);
                for(i=0;i<a2.size()-1;i++)
                    printf("%d ",a2[i]);
                printf("%d\n",a2[i]);
            }
    }
}

发表于 2017-03-04 19:28:48 回复(0)
啥头像
总体思路:
        1.判断是哪种排序方法。可根据插入排序的中间状态是后部分与初始状态一致,前部分是升序的特点来判断。
        2.获取下一状态,注意要与给出的中间状态不同,不是仅仅再执行一趟排序方法就行的

代码如下:
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    // 读入数据
    int N; cin >> N;
    vector<int> startState(N), midState(N);
    for(int i=0; i<N; i++) {
        cin >> startState[i];
    }
    for(int i=0; i<N; i++) {
        cin >> midState[i];
    }

    // 判断哪种排序
    bool isInsertion = true; int idx = N-1;
    while(midState[idx]==startState[idx]) {idx--;}
    while(idx>0) {
        if(midState[idx] < midState[idx-1]) {
            isInsertion = false; break;
        }
        idx--;
    }

    // 获取下一状态
    if(isInsertion) {
        for(idx=1; idx<=N; idx++) {
            sort(startState.begin(), startState.begin()+idx);
            if(startState == midState) {break;}
        }
        for(idx++; idx<=N; idx++) {
            sort(startState.begin(), startState.begin()+idx);
            if(startState != midState) {break;}
        }
        cout << "Insertion Sort" << endl;
    } else {
        for(idx=1; idx<=N; idx*=2) {
            int i=0;
            for(; i+idx<=N; i+=idx) {
                sort(startState.begin()+i, startState.begin()+i+idx);
            }
            if(i<N) sort(startState.begin()+i, startState.end());
            if(startState == midState) break;
        }
        for(idx*=2; idx<=N; idx*=2) {
            int i=0;
            for(; i+idx<=N; i+=idx) {
                sort(startState.begin()+i, startState.begin()+i+idx);
            }
            if(i<N) sort(startState.begin()+i, startState.end());
            if(startState != midState) break;
        }
        cout << "Merge Sort" << endl;
    }
    for(int i=0; i<N; i++) {
        if(i) cout << " ";
        cout << startState[i];
    }
    return 0;
} 


发表于 2015-12-27 18:42:02 回复(0)

问题信息

难度:
19条回答 7978浏览

热门推荐

通过挑战的用户