主要考查对插入排序和对归并排序的掌握
插入排序注意需要对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;
}