归并排序之确定递归层数

news2024/9/17 7:34:43

题目

给定一维int型数组a[0,1,…,n-1], 使用归并排序方法, 对其进行从小到大排序, 请输出递归过程中自顶自下第三层的排序结果, 其中最顶层为第一层, 即最终的排序结果层.
归并排序划分请按a[0,mid=(0+n-1)/2], a[(0+n-1)/2+1, n-1]进行划分子问题.

Input

输入第1行有一个int型正整数m (m<100), 表示有m行输入.
每行输入的第一个数为int型正整数n (8<n<1000), 后面接着输入n个int型整数.

Output

输出m行, 每行为排好序的输出.

Sample Input

2
9 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1 0

Sample Output

7 8 9 5 6 3 4 1 2
7 8 9 5 6 2 3 4 0 1

代码实现:

#include<iostream>
#include<vector>
using namespace std;


// 将两个子数组合并成一个有序数组
void merge(vector<int> &arr,int left,int mid,int right){
    // 两个数组的长度
    int len1 = mid-left+1, len2 = right-mid;

    vector<int> a(len1),b(len2);

    // 对两个数组分别赋值
    for(int i = 0;i<len1;i++){
        a[i] = arr[left+i];
    } 
    for(int i = 0;i<len2;i++){
        b[i] = arr[mid+1+i];
    }

    // 对两个数组进行比较,结果放入arr数组
    int i = 0,j = 0,k = left;
    while(i<len1 && j<len2){
        if(a[i]<=b[j]){
            arr[k++] = a[i++];
        }else {
            arr[k++] = b[j++];
        }
    }

    // 其中一个数组没还遍历完,直接拷贝到arr数组后面
    while(i<len1){
        arr[k++] = a[i++];
    }
    while(j<len2){
        arr[k++] = b[j++];
    }
}


// 归并排序
void mergeSort(vector<int> &arr, int left, int right,int depth){
    if(left<right){
        int mid = left+(right-left)/2;

        // 分别对左右两半进行排序
        mergeSort(arr,left,mid,depth+1);
        mergeSort(arr,mid+1,right,depth+1);

        // 归并
        if(depth>=3){
            merge(arr,left,mid,right);
        }
        
    }
}



int main(){
    int m;
    //cout<< "请输入m, 表示m行:";
    cin >> m;
    cin.ignore();

    vector<vector<int> > res;

    for(int i = 0;i<m;i++){
        // 输入元素个数
        int n;
        cin >> n;
        // 输入n个元素
        vector<int> arr(n);
        for(int i = 0;i<n;i++){
            cin >> arr[i];
        }

        // 输入完元素之后,进行排序
        mergeSort(arr,0,n-1,1);

        res.push_back(arr);
    }

    // 打印
    for(int i = 0;i<m;i++){
        for(int j = 0;j<res[i].size();j++){
            cout << res[i][j] << " ";
        }
        cout<< endl;
    }
    return 0;
}

我觉得主要的难点是如何返回第三层这个中间排序结果,看了一些别人的解答后,我自己对着程序画了一个大概的思维流程图,能够理解为什么是要设置depth>=3才进行合并。

图示如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1194181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI由许多不同的技术组成,其中一些最核心的技术如下

AI由许多不同的技术组成&#xff0c;其中一些最核心的技术包括&#xff1a; 机器学习&#xff1a;这是一种让计算机从数据中学习的技术&#xff0c;它可以根据已有的数据预测未来的趋势和行为。机器学习包括监督学习、无监督学习和强化学习等多种类型。深度学习&#xff1a;这…

Flink SQL -- 命令行的使用

1、启动Flink SQL 首先启动Flink的集群&#xff0c;选择独立集群模式或者是session的模式。此处选择是时session的模式&#xff1a;yarn-session.sh -d 在启动Flink SQL的client&#xff1a; sql-client.sh 2、kafka SQL 连接器 在使用kafka作为数据源的时候需要上传jar包到…

Flutter笔记:光影动画按钮、滚动图标卡片组等

Flutter笔记 scale_design更新&#xff1a;光影动画按钮、滚动图标卡片组 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263…

又一重要合作,创邻科技华为云联营产品正式发布

近日&#xff0c;创邻科技旗下的“Galaxybase高性能图平台”正式入驻华为云云商店联营商品&#xff0c;创邻科技成为华为云在数据库与缓存领域的联营联运合作伙伴。通过联营联运模式&#xff0c;双方合作能够深入产品、生态、解决方案等多个领域&#xff0c;助力各行业用户数字…

农业大棚智能化改造升级与远程视频监管方案,助力智慧农业建设发展

一、需求分析 随着现代化技术的发展&#xff0c;农业大棚的智慧化也成为当前备受关注的智慧农业发展手段。利用先进的信息化手段来对农业大棚进行管理&#xff0c;采集和掌握作物的生长状况、作业监督、生态环境等信息数据&#xff0c;实现精准操作、精细管理&#xff0c;远程…

SMART PLC模拟量上下限报警功能块(梯形图代码)

博途PLC模拟量偏差报警功能块请参考下面的文章链接: 模拟量偏差报警功能块(SCL代码)_RXXW_Dor的博客-CSDN博客文章浏览阅读594次。工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下:PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數…

Leetcode—637.二叉树的层平均值【简单】

2023每日刷题&#xff08;二十五&#xff09; Leetcode—637.二叉树的层平均值 BFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mu…

归并分治 归并排序的应用 + 图解 + 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 归并排序 图解 递归 非递归 笔记-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134338789?spm1001.2014.3001.5501原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&…

c语言break和continue语句用法

作用 break语句&#xff1a;可用于循环结构和开关结构(switch)中&#xff0c;在开关语句中的作用是执行完当前case后立即跳出switch结构。在循环语句中的作用是终止当前层的循环。continue语句&#xff1a;作用是跳过循环体中剩余的语句而强行执行下一次循环。 区别 continue…

golang 库之「依赖注入」

文章目录 1. 写在最前面2. 依赖注入2.1 使用场景2.2 框架对比 3. fx 框架使用场景示例3.1 示例3.2 golang 原生的库3.3 fx 库3.4 对比3.4.1 如上两种实现方式对比3.4.2 关于过度设计3.4.3 感悟 4. 碎碎念5. 参考资料 1. 写在最前面 同事在技术分享的时候用了 golang 的 fx 框架…

chatglm3-6b记录问答对

# 打开文件,第二个参数是打开文件的模式&#xff0c;a代表追加&#xff0c;也就是说&#xff0c;打开这个文件之后直接定位到文件的末尾 file open(chatlog.txt, "a") # 写入数据 file.write(ask:prompt_text\n) file.write(response:response\n) # 关闭文件 fil…

基于SSM的水果网上商城设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Ubuntu 安装常见问题

1. 安装oh my zsh 搜狗输入法不能用 vim /etc/environmentexport XIM_PROGRAMfcitx export XIMfcitx export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERS“imfcitx” export LANG“zh_CN.UTF-8”配置完后重启&#xff0c;稍等一会&#xff0c;右上角会有个…

35 字段类型不匹配 影响 使用索引?

前言 这是一个经常能够看到的问题, 又或者 经常在面试中碰到 如果 索引字段类型 不匹配, 然后 不会使用索引 这里 我们来看一下 具体的情况 测试表结构如下 CREATE TABLE tz_test (id int(11) unsigned NOT NULL AUTO_INCREMENT,field1 varchar(128) DEFAULT NULL,PRIMA…

接口自动化测试之Fiddler使用教程

一、Fiddler 简介 Fiddler工具介绍 Fiddler是一个通过代理的方式来进行抓包工具&#xff0c;运行时会在本地建立一个代理服务&#xff0c;默认地址&#xff1a;127.0.0.1:8888。Fiddler开启之后&#xff0c;配置本机代理&#xff0c;再打开IE浏览器&#xff0c;IE的PROXY会自…

C语言与C++的区别和联系

C语言和C到底是什么关系&#xff1f; 首先C和C语言本来就是两种不同的编程语言&#xff0c;但C确实是对C语言的扩充和延伸&#xff0c;并且对C语言提供后向兼容的能力。对于有些人说的“C完全就包含了C语言”的说法也并没有错。 C一开始被本贾尼斯特劳斯特卢普&#xff08;Bja…

身份证读取器手持机 二代证核验手持终端 身份证核查手持机

身份证手持机外观比较小巧&#xff0c;方便携带&#xff0c;支持条码识别、人脸识别、NFC卡刷卡、内置二代证加密模块&#xff0c;可离线采集和识别二代身份证&#xff0c;进行身份识别。信息读取更便捷、安全高效。采用IP65高防护等级&#xff0c;1.5M防摔&#xff0c;可以适应…

SmartBear正式收购Stoplight,并计划在核心API设计、文档和门户产品中集成其功能

不久前&#xff0c;软件开发和可视化工具提供商SmartBear正式宣布收购全球领先的API设计公司Stoplight。这一收购是为了打造业内最全面的API开发平台&#xff0c;为寻求现代化API实践的开发团队提供更好的透明度、自动化与生产力。将Stoplight在API方面的优势&#xff08;包括治…

Linux驱动应用层与内核层之间的数据传递

摘要 本文将深入探讨在Linux驱动中&#xff0c;应用层与内核层之间数据传递的机制和优化策略。我们将详细解析这一过程中的各个步骤&#xff0c;包括数据从应用层到内核层的传输&#xff0c;以及从内核层返回应用层的过程。此外&#xff0c;我们将提出并评估一系列可能的优化策…

Docker+K8s基础(重要知识点总结)

目录 一、Docker的核心1&#xff0c;Docker引擎2&#xff0c;Docker基础命令3&#xff0c;单个容器运行多个服务进程4&#xff0c;多个容器运行多个服务进程5&#xff0c;备份在容器中运行的数据库6&#xff0c;在宿主机和容器之间共享数据7&#xff0c;在容器之间共享数据8&am…