您的位置:首页 > 其它

1089. Insert or Merge (25)解题报告

2016-12-28 14:03 435 查看
每排序一步就比较一次。姥姥有更好的办法。但是我比较笨,喜欢简单而又粗暴的方法。其实相同的题目在乙级里面做过……

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define N 1000

bool cmp(int arr1[], int arr2[], int n);
void merge(int arr1[], int num, int cnt, int start);
bool mergesort(int arr1[], int arr2[], int num);
bool insertsort(int arr1[], int arr2[], int num);

int main(int argc, char** argv) {
int arr1
, arr2
, arr3
, num, i;
scanf("%d", &num);
for(i = 0; i < num; i++){
scanf("%d", &arr1[i]);
arr2[i] = arr1[i];
}
for(i = 0; i < num; i++){
scanf("%d", &arr3[i]);
}
if(insertsort(arr1, arr3, num)){
puts("Insertion Sort");
printf("%d", arr1[0]);
for(i = 1; i < num; i++){
printf(" %d", arr1[i]);
}
putchar('\n');
}
else{
mergesort(arr2, arr3, num);
puts("Merge Sort");
printf("%d", arr2[0]);
for(i = 1; i < num; i++){
printf(" %d", arr2[i]);
}
putchar('\n');
}
return 0;
}

bool cmp(int arr1[], int arr2[], int n){
int i;
for(i = 0; i < n; i++){
if(arr1[i] != arr2[i]){
return false;
}
}
return true;
}
void merge(int arr1[], int num, int cnt, int start){
int i, j, k, arr2
;
i = start;
j = i + cnt;
k = 0;
while(i < start + cnt && j < start + 2 * cnt && j < num){
if(arr1[i] > arr1[j]){
arr2[k++] = arr1[j++];
}
else{
arr2[k++] = arr1[i++];
}
}
while(i < start + cnt && i < num){
arr2[k++] = arr1[i++];
}
while(j < start + 2 * cnt && j < num){
arr2[k++] = arr1[j++];
}
for(i = 0; i < k; i++){
arr1[start + i] = arr2[i];
}
return;
}
bool mergesort(int arr1[], int arr2[], int num){
int cnt = 1, i;
bool flag = false;
while(cnt < num && !flag){
for(i = 0; i < num; i += 2 * cnt){
merge(arr1, num, cnt, i);
}
cnt *= 2;
flag = cmp(arr1, arr2, num);
}
for(i = 0; i < num && flag; i += 2 * cnt){
merge(arr1, num, cnt, i);
}
return flag;
}
bool insertsort(int arr1[], int arr2[], int num){
int i, j, tmp;
bool flag = false;
for(i = 1; i < num && !flag; i++){
tmp = arr1[i];
for(j = i - 1; j >= 0; j--){
if(arr1[j] < tmp){
break;
}
else{
arr1[j + 1] = arr1[j];
}
}
arr1[j + 1] = tmp;
flag = cmp(arr1, arr2, num);
}
tmp = arr1[i];
for(j = i - 1; j >= 0 && flag; j--){
if(arr1[j] < tmp){
break;
}
else{
arr1[j + 1] = arr1[j];
}
}
arr1[j + 1] = tmp;
return flag;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: