归并排序(c++,递归)
放上c++代码模板(但是该版本中,还可以再进一步优化成原地算法,即不开辟新的空间;本代码中空间复杂度为n,不是1)
1 #include <iostream>
2 #include<vector>
3 using namespace std;
4
5 void merge_func(vector<int> &v, int l, int m, int r)
6 {
7 vector<int> t;
8 int p=l, q=m+1;
9 while(p<=m && q<=r)
10 {
11 if(v[p]>v[q])
12 {
13 t.push_back(v[q]);
14 q++;
15 }
16 else
17 {
18 t.push_back(v[p]);
19 p++;
20 }
21 }
22 while(p<=m)
23 t.push_back(v[p++]);
24 while(q<=r)
25 t.push_back(v[q++]);
26
27 for(int i=l;i<=r;i++)
28 v[i] = t[i-l];
29
30 }
31
32 void merge_sort(vector<int> &v, int l, int r)
33 {
34 if(l<r)
35 {
36 int m = l+(r-l)/2; //先找到中点位置
37 merge_sort(v,l,m); //左侧归并排序
38 merge_sort(v,m+1,r); //右侧归并排序
39 merge_func(v,l,m,r); //合并左侧和右侧
40 }
41 }
42
43 int main()
44 {
45 vector<int> v={6,4,2,3,1,5};
46 //vector<int> v={3,6,1,2,4,7,5};
47 merge_sort(v,0,v.size()-1);
48 for(auto i:v)
49 cout<<i<<endl;
50 return 0;
51 }
归并排序(c++,递归)的更多相关文章
- 归并排序(非递归,Java实现)
归并排序(非递归):自底向上 public class MergeSort { /** * @param arr 待排序的数组 * @param left 本次归并的左边界 * @param mid ...
- 归并排序,递归法,C语言实现。
利用归并排序法对序列排序的示意图(递归法): 一.算法分析:利用递归的分治方法:1.将原序列细分,直到成为单个元素:2.在将分割后的序列一层一层地按顺序合并,完成排序.细分通过不断深入递归完成,合并通 ...
- Java归并排序的递归与非递归实现
该命题已有无数解释,备份修改后的代码 平均时间复杂度: O(NLogN) 以2为底 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + ...
- Sort List[leetcode] 由归并排序的递归和循环,到本题的两种解法
归并排序能够有两种思路----top-down 和 bottom-up top-down: 递归实现,将数组分成两半.分别处理.再合并. 伪代码例如以下: split ( A[], l, r) { i ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- 归并排序(递归排序and外排排序)
分析: /** * 归并排序 (先将数组利用归并排序排成 有序的左边数组和右边数组,再比较左边数组和右边数组的数值大小进行排序) * */ public class MergeSort { publi ...
- Python归并排序(递归实现)
为什么归并排序如此有用?1. 快捷和稳定归并排序成为⼀一个非常棒的排序算法主要是因为它的快捷和稳定.它的复杂度即使在最差情况下都是O(n log n).而快速排序在最差情况下的复杂度是O(n^2),当 ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- c++链表归并排序的迭代版本
之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...
- hdu 4911 Inversion(归并排序求逆序对数)2014多校训练第5场
Inversion Time Limit: 20 ...
随机推荐
- CV 履历 格式
CV 指的是 "Curriculum Vitae" Curriculum vitae 在拉丁语中的意思是"生命的故事" CV 经常被称为 "Resum ...
- quic是干什么的?
什么是quic? quic解决了什么问题?HTTP和QUIC QUIC :Quick UDP Internet Connections:是一种新的默认加密的互联网通信协议,它提供了许多改进,旨在加速H ...
- uboot——do_bootm
do_bootm |----------根据参数得到 image的起始地址 |----------比较header的 magic_num 是否为 zImage | |是 | | zImage路线 | ...
- python之《set》
set 是python里面的集合的概念 list_1 = [1,2,3,4,5,6,] list_2 = set(list_1) print(list_1,type(list_1)) print(li ...
- shell中数字、字符串、文件比较测试
1.逻辑运算符:与&& 或|| 非! &&:双目操作符:与运算中:如果第一个数为假,结果一定为假 ==> 短路操作符 ||:双目操作符:或运算 ...
- WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)
如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...
- 手把手教你5分钟从零开发一款简易的IDEA插件!项目经验/毕设不愁了!
我这个人没事就喜欢推荐一些好用的 IDEA 插件给大家.这些插件极大程度上提高了我们的生产效率以及编码舒适度. 不知道大家有没有想过自己开发一款 IDEA 插件呢? 我自己想过,但是没去尝试过.刚好有 ...
- 5、Spring Boot缓存
1.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider.CacheManager.Cache.Entry.Expiry. CachingProvider:定 ...
- 想要看懂鸿蒙OS源码?朱老师带你从框架分析开始
HarmonyOS V2.0是面向轻量级设备的鸿蒙L0/L1级设备端操作系统,于2020.9开源至今已有2个多月,但是很多同学在学习鸿蒙源码时仍然感觉难以下手,找不到突破口. 2020.11.25(本 ...
- kali 系列学习09-Kali-linux设置ProxyChains
ProxyChains是Linux和其他Unices下的代理工具.它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP.SOCKS4和SOCKS5类型的代理服务器,并且可配置多个 ...