归并排序之确定递归层数

2023-11-10 15:52

本文主要是介绍归并排序之确定递归层数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

给定一维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.chinasem.cn/article/383702

相关文章

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri