算法笔记-----归并排序
归并排序
介绍
归并排序(MERGE SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide- and- conquer)策略(分治法将问题分(divide) 成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。
也就是该算法的核心思想是分治思想
动态图解
我们发现我们的分并没有做什么其他的功能,只是将我们的数组拆分开来
为我们下面的治提供条件
我们再来看看他的复杂度,我们是8个数据,但是合并总共是7次
所以说他的复杂度是线性增长,不像其他的拍需要算法那样是平方增长
我们看最后一次合并做了什么
也就是说我们的归并排序是需要一个辅助数组的,这也是我们代码中最复杂的一部分
代码实现
package 数据结构;import java.lang.reflect.Array;
import java.util.Arrays;//归并排序
//@author 王庆华
public class MergetSort {public static void main(String[] args) {//创建数组int arr[] = {8,4,5,7,1,3,6,2};int temp[] = new int[arr.length];//归并排序需要一个额外的空间的megeSort(arr, 0, arr.length-1, temp);System.out.println("归并排序后"+Arrays.toString(arr));}//分解+合并方法 public static void megeSort(int[] arr,int left,int right, int[] temp){if(left<right){int mid = (left+right)/2;//中间索引//向左递归进行分解megeSort(arr, left, mid, temp);//向右递归分解megeSort(arr, mid+1, right, temp);//每分解一次就合并一次merge(arr, left, right, mid, temp);}}//合并的方法/*** * @param arr 需要排序的初始的数组* @param left 左边有序子序列的初始索引* @param right 右边有序子序列的索引* @param mid 中间索引* @param temp 辅助数组*/public static void merge(int[] arr,int left,int right,int mid,int[] temp){int i = left;//初始化i 表示左边有序子序列的初始索引int j = mid + 1;//j是我们右边子序列的初始索引int t = 0; //这个是我们辅助数组的当前索引,来帮助我们在那个地方插入值//(1)先把左右两边(有序)的数据按照规则填充到辅助数组temp中//直到左右两边的有序序列有一边处理完毕为止while(i <= mid && j <= right){if(arr[i] <= arr[j]){//左边有序子序列的当前元素<=右边有序序列的当前元素//左边的元素填充到辅助数组temp[t] = arr [i];t+=1;i+=1;}else{//反之就是右边进行拷贝操作temp[t] = arr[j];t+=1;j+=1;}}//(2)//把有剩余数据的一边,依次填充到辅助数组中while(i <= mid){//说明左边有序子序列有剩余元素temp[t] = arr[i];t+=1;i+=1;}while(j <= right){//右边有序子序列有剩余temp[t] = arr[j];t+=1;j+=1;}//(3)将辅助数组中的数据拷贝到arr中//注意并不是每一次都是拷贝所有的元素t = 0;int tempLeft = left;//while(tempLeft <= right){//第一次合并时 tempLeft=0 , right = 1//第二次 tempLeft = 2 riht = 3//最后一次tempLeft = 0 ,right = 7arr[tempLeft] = temp[t];t+=1;tempLeft+=1;}}
}
我们需要注意的是,拷贝数组的时候我们是用递归的,也就是说我们一开始是两个两个合并,所以辅助数组一开始不是直接拷贝8个数据的,也就是我们的tempLeft和right并不是0和7,而是0 1 2 3 然后合并成为0 3 也就是前四个数据,后面肯定会有4 7 合并,最后才是我们的0 7 整个数组
算法笔记-----归并排序相关推荐
- 算法笔记-归并排序、归并排序时间复杂度、例题
1. 归并排序 1)整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2)让其整体有序的过程里用了外排序方法 3)利用master公式来求解时间复杂度 4)归并排序的实质,实质是减少了元素间 ...
- 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...
来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...
- 算法笔记(JavaScript版)——排序
算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...
- java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)
1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...
- NOI提高级:排序算法之归并排序、快速排序
图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...
- 算法笔记(胡凡)学习笔记@Kaysen
本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...
- 数据结构与算法笔记(青岛大学王卓老师视频)
写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...
- codeup墓地目录(算法笔记习题刷题笔记)
在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门模拟->简单模拟 ...
- 《算法笔记》第四章笔记
<算法笔记>第四章 排序 排序算法的思想都比较简单,而且c++可以直接用sort函数进行排序,一般不会直接写排序代码 归根到底就是每轮处理一个数据,n个数据只需处理n-1次即可变得有序 选 ...
- 《算法笔记》学习 入门篇
目录 <算法笔记>学习 3.1 简单模拟 例1:[PAT B1001]害死人不偿命的(3n+1)猜想 例2:[PAT B1032]挖掘机技术哪家强 3.2 查找元素 例:[codeup 1 ...
最新文章
- 从理论到实践 全面理解HTTP/2
- C语言循环队列的实现方法,C语言循环队列(数组实现)
- 目前最全:52 个深度学习目标检测模型汇总,论文、源码一应俱全!
- 总结之前做项目中要注意的一些书写规范
- 函数进阶---闭包/装饰器/迭代器/生成器---高级特性
- (转) 分布式-微服务-集群的区别
- 单片机-控制-伺服电机-舵机
- ShopXO开源电商系统源码
- Windows 10 打印机驱动安装(以惠普M136 MFP为例)
- 香蜜经典句子摘抄,哪句勾起了你的回忆
- html id 重复,Apple ID一直重复登录无效!怎么处理!
- app 登录成功后 保存登录账号 密码 以及读取
- pyecharts全国地图和省级地图和水滴图
- NRF52832官方SDK介绍
- 深入浅出学算法——n个1(整除求余的优化)
- 神奇英语语法系列(四)——非谓语
- 移动CRM产品你选对了吗?四款入门平台推荐
- 毫秒级精度计划任务管理、系统运维管理、定时执行任务、定时任务执行、任务定时执行软件 —— 定时执行专家
- js 事件阻止传播方法,准确定位事件源
- 为飞机设计一款智能的黑匣子(针对过去飞机失事后飞机黑匣子的致命缺陷,如:马航370飞机失事若干年了,至今未有音信,飞机失事后黑匣子的安全和稳定性)
热门文章
- python与vb可以互换吗_VB6+Python混合编程(COM组件)(转)
- HighCharts:为plotLines基准线添加label标签不显示
- Swiper:基础学习
- ios调用restful接口_iPhone中调用RESTFUL Service
- bootstrap-table动态合并相同行和列的方法
- sql语句区分大小写吗?
- 微信公号“架构师之路”学习笔记(二)-高可用高并发负载均衡的架构设计(冗余+自动故障转移、水平扩展等)
- LIO-SAM探秘第二章之安装编译与参数配置
- JSON 解析之 FastJson
- QT 5 初学1 多窗口切分-续