合并两个排序的整数数组A和B变成一个新的数组(归并排序)
归并排序:将问题分成一些小的问题然后递归求解,将分的阶段得到的各答案合并在一起。
将两个有序数组合并为一个,给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]。
解题思路:从头开始比较两个数列中的数,哪一个小就取出依次存入新的数组中,直到其中一个全部比较完,将另一个数组剩下的部分直接存入新的数组中。
vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {int i=0,j=0;std::vector<int>c; while(i<A.size()&&j<B.size()){if(A[i]<B[j])c.push_back(A[i++]);elsec.push_back(B[j++]);}while(i<A.size()){c.push_back(A[i++]);}while(j<B.size()){c.push_back(B[j++]);}return c;}
将一个乱序数组排序
归并排序:将问题分成一些小的问题然后递归求解,将分的阶段得到的各答案合并在一起。
将乱序数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。
将A,B排序,当分出来的小组只有一个数据时(数据长度为1,即数据起始下标等于终止下标),可以认为这个小组组内已经达到了有序。
#include <iostream>
using namespace std;void mergearray(int a[], int first, int mid, int last, int temp[])
{int i = first, j = mid + 1;int m = mid, n = last;int k = 0;while (i <= m && j <= n){if (a[i] <= a[j])temp[k++] = a[i++];elsetemp[k++] = a[j++];}while (i <= m)temp[k++] = a[i++];while (j <= n)temp[k++] = a[j++];for (i = 0; i < k; i++)a[first + i] = temp[i];//对first-last排序
}
void mergesort(int a[], int first, int last, int temp[])
{if (first < last){cout<<"sort"<<" "<<first<<" "<<last<<endl;int mid = (first + last) / 2;cout<<"left"<<" "<<first<<" "<<mid<<endl;mergesort(a, first, mid, temp); //左边有序cout<<"right"<<" "<<mid+1<<" "<<last<<endl;mergesort(a, mid + 1, last, temp); //右边有序cout<<"merge "<<first<<" "<<last<<endl;mergearray(a, first, mid, last, temp); //再将二个有序数列合并}
}int main()
{int a[]={10,50,30,40,20};int length=sizeof(a)/sizeof(a[0]);int temp[length];mergesort(a,0,length-1,temp);for(int i=0;i<length;i++)cout<<a[i]<<endl;return 0;
}
输出结果:
sort 0 4
left 0 2
sort 0 2
left 0 1
sort 0 1
left 0 0
right 1 1
merge 0 1
right 2 2
merge 0 2
right 3 4
sort 3 4
left 3 3
right 4 4
merge 3 4
merge 0 4
10
20
30
40
50
第一次进入mergesort函数
左边first——mid是0-2(超过一个元素)继续划分左边
再一次进mergesort函数(0-2)
左边first——mid是0-1(超过一个元素)继续划分
再一次进入mergesort函数(0-1)
左边fisrt——mid是0-0(一个元素)mid+1-last是1-1(一个元素),因此合并排序左边和右边两个数组(两个元素)0和1
退出到上一次递归循环执行到的语句,继续执行后续语句
右边排序mid+1——last是2-2(只有一个元素),因此合并排序左边有序数组0-1和右边数组2
退出到上一次递归执行到的语句,继续执行后续语句
右边排序mid+1——last是3-4,(超过一个元素)继续划分
进入mergesort函数(3-4)
左边first——mid是3-3,右边是mid+1——last是4-4,都仅有一个元素,因此合并排序
退出到上一次递归未执行语句处,继续执行
合并左边有序数组0,1,2和右边有序数组3,4
归并排序结束!
算法复杂度:
时间复杂度:
平均时间复杂度:O(nlogn)
最好情况复杂度:O(nlogn)
最坏时间复杂度:O ( nlogn )
平均、最好、最坏时间复杂度都相同,因此稳定性非常好!
空间复杂度: O(n)
合并两个排序的整数数组A和B变成一个新的数组(归并排序)相关推荐
- java:合并两个排序的整数数组A和B变成一个新的数组。新数组也要有序。
合并两个排序的整数数组A和B变成一个新的数组.新数组也要有序. 样例 1:输入: A=[1], B=[1]输出:[1,1]样例解释: 返回合并后的数组.样例 2:输入: A=[1,2,3,4], B= ...
- 循环数组对象,并且返回一个新的数组对象
最基础的,感觉挺好用 ```javascript [{dd:'22',AA:'张三',re1:123},{dd:'33',AA:'李四',re1:234},{dd:'44',AA:'我去',re1:4 ...
- php 去除二维数组中的包含某一个值的数组
今天写程序,遇到一个的问题. 我想把一个二维数组中的包含某一个值的数组去掉,并重新生成索引下标 例如: $all_zone=array(array("id"=>"R ...
- 面试题整理 4 合并两个排序的数组
对于链表,<剑指offer>中感觉有些地方不妥,前面讲过链表的头指针是指向一个指针的指针,即指向头结点的指针的指针.但是后面在链表的使用中输入的头指针只是指向链表的头结点的指针. 后面看& ...
- 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...
- JZ50第一个只出现一次的字符JZ50第一个只出现一次的字符JZ25合并两个排序的链表思路
记录一下看到的比较好理解的思路,通过几张图理解还是很快乐的吖~可以看一下 JZ50 第一个只出现一次的字符 JZ4 二维数组中的查找 JZ25 合并两个排序的链表
- 剑指offer:面试题25. 合并两个排序的链表
题目:合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1-& ...
- 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java
<LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...
- 【剑指offer-Java版】17合并两个排序链表
合并两个排序链表:老生常谈的内容了 while循环或者递归 注意:输入链表存在一个空或者两个空 public class _Q17 {public ListNode<Integer> Me ...
最新文章
- hibernate mysql annotation_hibernate学习笔记03-- hibernate + mysql + Annotation
- joda jar日期处理类的学习
- Java Graphics2D类的绘图方法
- 使用 .toLocaleString() 轻松实现多国语言价格数字格式化
- 热更新_UnityXlua热更新
- 2019.6.27刷题统计
- RocketMQ消息消费之长轮询
- 【.NET开发之美】使用ComponentOne提高.NET DataMap中的加载速度
- (1)Spring框架----通俗易懂的IoC原理
- flash绘制荷花多个图层_《荷花》Flash动画课件
- 阿里开发规约之编程规约(4)
- 【后端】短信验证码4位或6位
- 没有寻线仪怎么找网线_乱七八糟的网线怎么找?寻线仪来帮你
- 2022年全球及中国工业五金垫圈行业研究
- java/php/net/python旅行社信息管理系统设计
- APP界面设计规范一(ios版)
- A1012 The Best Rank
- Java后端技术微信交流群!工作、学习、技术、资源等!期待你的加入!
- Http系列---HTTP/1.1全面分析
- lucene和Elasticsearch
热门文章
- 《Microsoft Sql server 2008 Internal》读书笔记--第七章Special Storage(3)
- win7系统提示0x80072F8F错误代码的解决方法(已经验证)
- Excel VBA编写excel数据汇总宏命令
- linux中txt文件第一列增加内容(awk)
- 关于项目启动会和项目开工会议的区别
- Github SSH keys 配置问题
- 存储器芯片类别有哪些?
- html css 图片底部空,HTML学习 | 图片底部透明css实现
- leetcode之青蛙过河(C++)
- mysql临时表创建_MySQL临时表创建