归并排序

特点:非原址排序,比较排序,时间复杂度O(nlgn)
稳定

//
// Created by 许加权 on 2021/6/18.
//#include <iostream>
void merge_sort(int *arr,int start,int end)
{if(start < end){int middle = (start + end)/2;merge_sort(arr,start,middle);merge_sort(arr,middle+1,end);int *left_arr = new int[middle - start + 2];int *right_arr = new int[end - start + 2];for (int i = start; i < middle+1; ++i) {left_arr[i-start] = arr[i];}left_arr[middle-start+1] = INT_MAX;for(int i = middle+1;i<end+1;i++){right_arr[i-middle-1]= arr[i];}right_arr[end - middle] = INT_MAX;int left =0,right = 0;for (int i = start; i < end+1; ++i) {if(left_arr[left]<right_arr[right]){arr[i] = left_arr[left];left++;}else{arr[i] = right_arr[right];right++;}}delete [] left_arr;delete [] right_arr;}
}void show(int *arr,int length)
{for(int i=0;i<length;i++){std::cout<<arr[i]<<" ";}std::cout<<std::endl;
}int main()
{int arr[] = {1,4,6,9,2,5,10,3,7};show(arr,sizeof(arr)/sizeof (int));merge_sort(arr,0,sizeof(arr)/sizeof (int)-1);show(arr,sizeof(arr)/sizeof (int));
}

内涵插入排序的归并排序
时间复杂度
Θ(nk+nlg(n/k))
k取lgn

void merge(int *arr,int start,int end,int middle)
{int *left_arr = new int[middle - start + 2];int *right_arr = new int[end - start + 2];for (int i = start; i < middle+1; ++i) {left_arr[i-start] = arr[i];}left_arr[middle-start+1] = INT_MAX;for(int i = middle+1;i<end+1;i++){right_arr[i-middle-1]= arr[i];}right_arr[end - middle] = INT_MAX;int left =0,right = 0;for (int i = start; i < end+1; ++i) {if(left_arr[left]<right_arr[right]){arr[i] = left_arr[left];left++;}else{arr[i] = right_arr[right];right++;}}delete [] left_arr;delete [] right_arr;
}
void merge_sort_internal_insertion(int *arr,int start,int end,int k)
{if(end - start + 1> k){int middle = (start + end)/2;merge_sort_internal_insertion(arr,start,middle,k);merge_sort_internal_insertion(arr,middle+1,end,k);merge(arr,start,end,middle);}else{insertion_sort(arr,start,end);}
}

内部插入排序代码地址:插入排序

案例:利用归并排序的原理,求逆序对的个数:
代码地址

算法-排序-归并排序相关推荐

  1. 大话算法-排序-归并排序

    归并排序是将两个已经排序的序列合并成一个序列的操作 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置 3.比较两个指 ...

  2. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  3. 【DS】排序算法之归并排序(Merge Sort)

    一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...

  4. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  5. 看动画学算法之:排序-归并排序

    文章目录 简介 归并排序的例子 归并排序算法思想 归并排序的java实现 归并排序的时间复杂度 简介 归并排序简称Merge sort是一种递归思想的排序算法.这个算法的思路就是将要排序的数组分成很多 ...

  6. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  7. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  8. 排序算法:归并排序算法实现及分析

    归并排序算法介绍 归并排序(Merging Sort)就是利用归并的思想实现排序的放.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个 ...

  9. 结合内存分析java归并排序_排序算法之归并排序(Mergesort)解析

    一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧:归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界 归并排序是一种稳 ...

最新文章

  1. 皮一皮:谈恋爱一定要谨慎...
  2. Django的Form表单
  3. python关键字as_python 之 import、from、as 关键字的 白话 解释与例子
  4. java实现发送邮箱邮件
  5. ZZULIOJ 1098: 复合函数求值(函数专题)
  6. eclipse修改java热部署免重启tomcat在Host标签下增加Context直接将docBase指定为项目的WebContent路径
  7. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
  8. 联想p720装系统_教你装系统第六节(装系统需要注意那些?)
  9. 字符集与编码系列:Unicode字符集
  10. x61 linux 驱动下载,ThinkPad T61/X61换XP系统及驱动下载
  11. 数字化定量分析_数字化驱动下的华夏银行信用卡精细化智能服务
  12. vmware workstation14密钥记录
  13. 我的实用小软件(持续更新)
  14. SanDisk cz48 16G TLC U盘量产经验分享
  15. python14张图下载_Python网络爬虫入门(三)—— 做个简陋的pixabay 图片下载器 (附源码)...
  16. 手机apk应用程序未安装解决办法
  17. 分享:快捷方便的函数命名网站
  18. 汽车侧向动力学模型简介(动力学建模入门知识)
  19. mysql数据库实验+cmd界面运行基本操作总结(sql:数据增删改查,表格,视图,备份恢复)
  20. 关于10的勾股数有哪些_股票投资收益分析包括哪些方面

热门文章

  1. C和指针之字符串编程练习9(在参数1中查找匹配参数2额任意字符)
  2. HTML基础之bit哥的反客为主之道(9)
  3. Web程序员的Mysql进阶序一之sql使用分类及基础
  4. sql order by,desc和limit使用(mysql)
  5. makefile运行_NVDIA TX2入门 系列之三:运行Yolov3
  6. java中find方法_Java Document.find方法代码示例
  7. cms的 php代码,KingCMS/PHP可执行代码
  8. python process 函数_Python Process创建进程的2种方法详解
  9. 复工之后,如何让自己的时间更值钱
  10. 除了PS,还有它可以轻松实现图像处理!