#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
int n, k = 0;
scanf("%d", &n);
int a[n], b[n], c[n];
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
c[i] = a[i];
}
for(int i = 0; i < n; i++){
scanf("%d", &b[i]);
}
for(int step = 2; step / 2 < n; step *= 2){
for(int i = 0; i < n; i += step){
sort(a + i, a + min(i + step, n));
}
if(k == n){
printf("Merge Sort\n");
for(int i = 0; i < n; i++){
if(i == 0) printf("%d", a[i]);
else printf(" %d", a[i]);
}
break;
}
k = 0;
for(int i = 0; i < n; i++){
if(a[i] == b[i]) k++;
}
}
k = 0;
for(int i = 1; i < n; i++){
int temp = c[i], j = i;
while(temp < c[j - 1] && j > 0){
c[j] = c[j - 1];
j--;
}
c[j] = temp;
if(k == n){
printf("Insertion Sort\n");
for(int i = 0; i < n; i++){
if(i == 0) printf("%d", c[i]);
else printf(" %d", c[i]);
}
break;
}
k = 0;
for(int i = 0; i < n; i++){
if(c[i] == b[i]) k++;
}
}
return 0;
}
第一次,独立完成,1h
#include<stdio.h>
#include<algorithm>
using namespace std;
void Merge(int a[], int L1, int R1, int L2, int R2){
int i = L1, j = L2, temp[110], index = 0;
while(i <= R1 && j <= R2){
if(a[i] <= a[j]) temp[index++] = a[i++];
else temp[index++] = a[j++];
}
while(i <= R1) temp[index++] = a[i++];
while(j <= R2) temp[index++] = a[j++];
for(int i = 0; i < index; i++){
a[L1 + i] = temp[i];
}
}
void insertsort(int a[], int i){
int temp = a[i], j = i;
while(temp < a[j - 1] && j > 0){
a[j] = a[j - 1];
j--;
}
a[j] = temp;
}
int main(){
int n;
scanf("%d", &n);
int a[n], b[n], c[n];
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
c[i] = a[i];
}
for(int i = 0; i < n; i++){
scanf("%d", &b[i]);
}
for(int i = 1; i < n; i++){
insertsort(a, i);
bool flag = false;
for(int j = 0; j < n; j++){
if(a[j] != b[j]) flag = true;
}
if(flag == false){
printf("Insertion Sort\n");
insertsort(a, i + 1);
for(int j = 0; j < n; j++){
if(j == 0) printf("%d", a[j]);
else printf(" %d", a[j]);
}
break;
}
}
for(int step = 2; step / 2 <= n; step *= 2){
for(int i = 0; i < n; i += step){
int mid = i + step / 2 - 1;
if(mid + 1 <= n - 1) Merge(c, i, mid, mid + 1, min(n - 1, i + step - 1));
}
bool flag = false;
for(int j = 0; j < n; j++){
if(c[j] != b[j]) flag = true;
}
if(flag == false){
printf("Merge Sort\n");
step *= 2;
for(int i = 0; i < n; i += step){
int mid = i + step / 2 - 1;
if(mid + 1 <= n - 1) Merge(c, i, mid, mid + 1, min(n - 1, i + step - 1));
}
for(int j = 0; j < n; j++){
if(j == 0) printf("%d", c[j]);
else printf(" %d", c[j]);
}
break;
}
}
return 0;
}
注意用数组c复制a的值,在第二次使用时用c
归并排序
要点1:if(mid + 1 <= n - 1) Merge(c, i, mid, mid + 1, min(n - 1, i + step - 1)); 不要忘了if条件
要点2:int i = L1, j = L2;不能直接使用L1,L2;