1035 插入与归并 (25 分)

主要考查对插入排序和对归并排序的掌握
插入排序注意需要对A[i]设置一个中间变量保存,否则会被覆盖,反正我经常忘记。
归并排序我经常对两个排好序的链表和数组归并,但是很少对整个数组从头归并。
所以最好记个模板。

void mergeSort(int A[]){
	for(int step=2;step/2 < n;step=step*2){ //中间这个变量不用取等 比如8个数排序 最大步数为8路归并 并不需要16路归并
		for(int i=0;i<n;i+=step){
			sort(A+i,A + min(step+i, n));
		}
	}
}

题解

注意要设置一个备份数组,否则归并排序的时候,初始状态就会是插入排序排好序的结果。

//暴力搜索
//枚举两种算法的中间的结果,挨个比对。 
#include<cstdio>
#include<algorithm>
using namespace std;
int arr[105],brr[105],tmp[105];
int n;

int check(){
	for(int i=0;i<n;i++){
		if(arr[i]!=brr[i]) return 0;
	}
	return 1;
}


int check2(){
	for(int i=0;i<n;i++){
		if(tmp[i]!=brr[i]) return 0;
	}
	return 1;
}
int InsertSort(){
	int j=0,flag=0;
	for(int i=1;i<n;i++){
		int temp = arr[i];
		j=i-1;
		while(j>=0&& arr[j] > temp){
			arr[j+1]=arr[j];
			j--;
		}
		arr[j+1]=temp;
		if(flag==1) return 1;
		if(check()){
			flag=1;
		} 
	}
	return 0;
}
void MergeSort(){
	int flag=0;
	for(int step=2;step/2 <= n;step=step*2){
		
		
		for(int i=0;i<n;i+=step){
			sort(tmp + i,tmp + min(step+i, n));
		}
	
		if(flag) 	return;
		if(check2()){
			flag=1;
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",arr+i);
		tmp[i]=arr[i];
	}
	for(int i=0;i<n;i++){
		scanf("%d",brr+i);
	}
	
	int t=InsertSort();
	if(t){
		printf("Insertion Sort\n");
		for(int i=0;i<n;i++){
			printf(i==0?"%d":" %d",arr[i]);
		}
		return 0;
	}
	MergeSort();
	printf("Merge Sort\n");
	for(int i=0;i<n;i++){
		printf(i==0?"%d":" %d",tmp[i]);
	}
	
	return 0;
}

2019.11.29

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue> 
#include <algorithm>
using namespace std;
const int N = 105;
int arr[N], temp[N], backup[N];
int n;
bool insertSort(){
	int flag = false;
	for(int i = 1; i < n; i++){
        int t = arr[i], j = i-1; //先保存i位置上的值 然后值后移
		while(j >= 0 && arr[j] > t){
			arr[j+1] = arr[j];
			j--;
		}
		arr[j+1] = t;
		if(flag) return true;
		int tag = true;
		for(int k = 0; k < n; k++){
			if(arr[k] != temp[k]) tag = false;
		}
		if(tag) flag = true;   		
	}
	return false;
}
void mergeSort(){
	int flag = false;
	for(int step = 2; step/2 < n; step *= 2){
		for(int i = 0; i < n; i+=step){
			sort(backup+i, backup+ min(n, i + step));
		}
		if(flag) return;
		int tag = true;
		for(int k = 0; k < n; k++){
			if(backup[k] != temp[k]) tag = false;
		}
		if(tag) flag = true;   
	}
}
int main(){
	int x;
	scanf("%d", &n);
	for(int i = 0; i < n; i++) scanf("%d", arr+i), backup[i] = arr[i];
	for(int i = 0; i < n; i++) scanf("%d", temp+i);
	//插入排序
	if(insertSort()){
		puts("Insertion Sort");
		for(int i = 0; i < n; i++){
			printf("%d", arr[i]); 
			if(i != n-1) printf(" ");
			else printf("\n");
		}
	}else{ //归并排序 
		puts("Merge Sort");
		mergeSort();
		for(int i = 0;i < n; i++){
			printf("%d", backup[i]); 
			if(i != n-1) printf(" ");
			else printf("\n");
		}
	} 
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值