排序算法-归并排序详细图解
归并排序:
采用了分治策略 就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。
归并的核心思想 将两个有序的数组合并成一个大的有序的数组,通过递归把待排序数组变成完全有序数组。
归并的核心算法就是如何将2个数组合并
算法思想:
将待排序数组一直往下分解直到不可分解为止也就是一个数为一个子数组
然后对这些子数组层层合并(合并里有排序的过程)得到最后的有序数组
分解的过程很简单 就是一直递归向下分解 直到一个元素一组为止
合并原理:
其实就是合并2个有序数组的算法:
首先要有一个临时数组temp 以及2个索引分别指向2个数组的首地址 让2个索引对应的值进行比较 谁对应的值小 把值小的放入temp 然后当前索引++ 再循环比较 肯定会有一个数组索引先到头 在对另一个数组剩下的元素遍历放入temp即可
然后再把合并好的数组放会原数组对应的为止 就算完成此次合并
以 {3,4,6,10} {2,5,7,8} 为例作图给大家演示下:
两个数组索引对应的值进行比较 小的放进临时数组 索引++ 然后继续比较
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 |
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 | 3 |
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 | 3 | 4 |
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 | 3 | 4 | 5 |
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 | 3 | 4 | 5 | 6 |
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 | 3 | 4 | 5 | 6 | 7 |
↓ | ↓ | |||||||
3 | 4 | 6 | 10 | 2 | 5 | 7 | 8 |
temp | |||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
此时 其中一个数组索引已经到头了 然后直接对另一个数组剩余元素进行遍历放入temp即可
可能有些童鞋会有疑问为什么剩下的直接放进去就行?
因为2个数组都是有序数组 此数组当前索引对应的值比另一个数组最大值都大 此数组剩余元素值肯定大于另一个数组而且还是从小到大排列的 所以直接放入temp就可以了麻
temp | |||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 |
动图展示:
算法代码:
public class Sort {public static void main(String[] args) {int[] a={10,4,6,3,8,2,5,7};//归并排序mergeSort(a,0,a.length-1);}private static void mergeSort(int[] a, int left, int right) {if(left<right){int middle = (left+right)/2;//对左边进行递归mergeSort(a, left, middle);//对右边进行递归mergeSort(a, middle+1, right);//合并merge(a,left,middle,right);}}private static void merge(int[] a, int left, int middle, int right) {int[] tmpArr = new int[a.length];int mid = middle+1; //右边的起始位置int tmp = left;int third = left;while(left<=middle && mid<=right){//从两个数组中选取较小的数放入中间数组if(a[left]<=a[mid]){tmpArr[third++] = a[left++];}else{tmpArr[third++] = a[mid++];}}//将剩余的部分放入中间数组while(left<=middle){tmpArr[third++] = a[left++];}while(mid<=right){tmpArr[third++] = a[mid++];}//将中间数组复制回原数组while(tmp<=right){a[tmp] = tmpArr[tmp++];}}
}
排序算法-归并排序详细图解相关推荐
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...
- 十大经典排序算法-归并排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- python排序算法——归并排序(附代码)
python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...
- 图解排序算法-归并排序
基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而 ...
- 八大排序算法 —— 归并排序
归并排序 归并算法的理解比较难,是一种区别于插入算法,选择算法和交换算法的一种独特算法,需要逐步理解. 核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治( ...
- 排序算法 —— 归并排序
归并排序算法 1.划分问题:把序列分成元素个数尽量相等的两半. 2.递归求解:把两半元素分别排序. 3.合并问题:把两个有序表合并成一个. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用 ...
- (四)十大经典排序算法(动画图解,代码完全)
排序算法是<数据结构与算法>中最基本的算法之一 1. 冒泡排序 1.1 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的 ...
- 二分归并排序算法_第五篇排序算法|归并排序
0x01,前言闲叙 最近几年很少看电视了,因为没时间看了,除了偶尔刷刷头条,基本上不会花大块的时间沉迷于电视剧,综艺,这或许就是短视频时代所带来的一些改变吧,我们都会深受其中. 0x02,先看下这篇文 ...
- Python数据结构常见的八大排序算法(详细整理)
前言 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法. 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下 ...
最新文章
- SharePoint Server 2007 页面模型
- .NET技术 ASP.NET中常用的文件上传下载方法(多文件上传)
- python最新版本-最新版Python 3.8.6 版本发布
- 代码: html 页面小效果 (集合,待补充)
- AS3.0的int uint Number的使用原则
- **Java有哪些悲观锁的实现_阿里秋招Java研发工程师岗:来自校友的面试还原(已拿Offer)...
- 电气期刊论文实现:基于输电线路容量安全约束的电力机组组合
- 【若依(ruoyi)】部门查询SQL
- 重学java基础第十五课:java三大版本
- java打印等腰梯形
- 《优化算法》人工鱼群算法学习 超详细解析 附JAVA和matlab示例
- Max Script|多边形的控制
- Python求解二元二次函数梯度
- Centos 8.5系统优化方案
- 方法论-5W2H七问分析法
- Python面向对象案例之语音计算器
- 傻妞旧版合集新版订阅
- 瑞典皇家理工学院计算机硕士,均分不足80获瑞典皇家理工学院硕士录取
- 电影9 10大经典电影
- 企查查爬虫循环获取信息
热门文章
- Android--剪贴板
- Springboot项目架构设计
- oracle column name as sign,Oracle日常性能查看 - ella的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- mysql outer join报错_千与千寻-MySQL联结join
- 怎样自己制作一个小程序?新手必知流程!
- Android安卓毕业设计,SpringBoot+MySQL+Android studio 实现一个二手交易平台APP
- 计时器计算小时、分钟、秒数
- 宾果消消消鸿蒙版,宾果消消消官方版
- Java笔试 系列一
- 耗油是什么,怎么用?