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

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

#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[N], arr2[N], arr3[N], 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[N];
    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;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值