美文网首页
B1035 插入与归并 (25分)

B1035 插入与归并 (25分)

作者: km15 | 来源:发表于2020-02-06 12:57 被阅读0次

include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop
题意:
1、判断是归并还是插入
2、输出算法名字+下一次迭代的算法

解题:
1、模拟归并和插入的每一步过程
2、先进行插入排序,如果执行过程中发现与给定序列吻合,则说明是插入,并计算下一步
如果不是,则用归并,如果过程中序列吻合,则计算下一步

learn && wrong:
1、数据范围小,归并可以不写合并函数,直接用sort函数
2、陷阱:初试序列不参与是否与目标序列相同的比较,(也就是题目中的中间序列是不包括初试序列的)不考虑这个会导致某个数据产生双解
3、忘记插入排序怎么写,忘记归并迭代怎么写
4、有一个issame函数,和一个show函数,+
insertsort函数,改变在进入循环开始,就判断,之后的时候,还进行一次迭代,再判断,如果成立返回true,与主函数里的if形成一套并调用show函数
mergesort函数,也是一开始判断,中间再迭代一次,与之不同的是,最后判断的时候,直接输出而不是在else这个模块输出了
5、mergesort函数与sort函数连用,其实迭代的写法也不难记忆,就是没经常写
*/

include <algorithm>

using namespace std;
const int N = 111;
int origin[N], tempori[N], changed[N];
int n;//元素个数

bool issame(int a[], int b[]) {
for (int i = 0;i < n;++i) {
if (a[i] != b[i]) return false;
}
return true;
}

void showarray(int a[]) { //输出数组
for (int i = 0;i < n;++i) {
cout << a[i];
if (i != n - 1) cout << " ";
}
cout << endl;
}

bool insertsort() {//插入排序
bool flag = false; //记录是否存在数组中间步骤与changed数组相同
for (int i = 1;i < n;++i) {
if (i != 1 && issame(tempori, changed)) {
flag = true; //中间步骤与目标相同,且不是初试序列
}

    //以下为插入部分
    int temp = tempori[i], j = i;
    while (j > 0 && temp < tempori[j - 1]) {
        tempori[j] = tempori[j - 1];
        --j;
    }
    tempori[j] = temp;

    if (flag == true) {
        return true;
    }
}
return false;

}

void mergesort() {
bool flag = false; //记录是否存在数组中间步骤与changed相同
for (int step = 2;step / 2 <= n;step *= 2) {

    if (step != 2 && issame(tempori,changed) == true) { //中间步骤与目标序列相同,且不是初试序列 
        flag = true;
    }

    for (int i = 0;i < n;i += step) {
        sort(tempori + i, tempori + min(step + i, n));
    }

    if (flag == true) {
        showarray(tempori);
        return;
    }
}

}

int main(int argc, char** argv) {
cin >> n;
for (int i = 0;i < n;++i) {
cin >> origin[i];
tempori[i] = origin[i]; //数组备份
}

for (int i = 0;i < n;++i) {
    cin >> changed[i];      //目标数组
}

if (insertsort()) {
    printf("Insertion Sort\n");
    showarray(tempori);
}
else {
    printf("Merge Sort\n");
    for (int i = 0;i < n;++i) {
        tempori[i] = origin[i];
    }
    mergesort();
}
return 0;

}

相关文章

  • B1035 插入与归并 (25分)

    include /* run this program using the console ...

  • 常见排序算法

    1 前言 2 排序基础2.1 选择排序2.2 插入排序 3 高级排序算法3.1 归并排序3.1.1 插入排序与归并...

  • 1035 插入与归并

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取...

  • JavaScript实现排序算法

    实现了冒泡,选择,插入,快排,希尔,归并 冒泡排序 选择排序 插入排序 快速排序 希尔排序 归并排序

  • 排序

    冒泡 插入 选择 谢尔 归并 快速

  • 堆排序(HeapSort)

    与归并排序一样,但不同于插入排序的是,堆排序的时间复杂度是O(nlgn)。而与插入排序相同,但不同于归并排序的是,...

  • 排序 -- 2

    插入排序 归并排序 快速排序

  • 各种排序算法代码

    冒泡 插入 选择(基本没用) 归并 快排

  • Datawhale | 编程第6期 Test 3

    排序 1.实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做) 归并排序 快速排序 插入排序 冒泡...

  • 排序 -- 选择/插入

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 选择排序与插入排序 ...

网友评论

      本文标题:B1035 插入与归并 (25分)

      本文链接:https://www.haomeiwen.com/subject/qegyxhtx.html