归并排序

介绍

归并排序(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. 归并排序 1)整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2)让其整体有序的过程里用了外排序方法 3)利用master公式来求解时间复杂度 4)归并排序的实质,实质是减少了元素间 ...

  2. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...

    来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...

  3. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  4. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

    1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...

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

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

  6. 算法笔记(胡凡)学习笔记@Kaysen

    本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...

  7. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  8. codeup墓地目录(算法笔记习题刷题笔记)

    在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门模拟->简单模拟 ...

  9. 《算法笔记》第四章笔记

    <算法笔记>第四章 排序 排序算法的思想都比较简单,而且c++可以直接用sort函数进行排序,一般不会直接写排序代码 归根到底就是每轮处理一个数据,n个数据只需处理n-1次即可变得有序 选 ...

  10. 《算法笔记》学习 入门篇

    目录 <算法笔记>学习 3.1 简单模拟 例1:[PAT B1001]害死人不偿命的(3n+1)猜想 例2:[PAT B1032]挖掘机技术哪家强 3.2 查找元素 例:[codeup 1 ...

最新文章

  1. 从理论到实践 全面理解HTTP/2
  2. C语言循环队列的实现方法,C语言循环队列(数组实现)
  3. 目前最全:52 个深度学习目标检测模型汇总,论文、源码一应俱全!
  4. 总结之前做项目中要注意的一些书写规范
  5. 函数进阶---闭包/装饰器/迭代器/生成器---高级特性
  6. (转) 分布式-微服务-集群的区别
  7. 单片机-控制-伺服电机-舵机
  8. ShopXO开源电商系统源码
  9. Windows 10 打印机驱动安装(以惠普M136 MFP为例)
  10. 香蜜经典句子摘抄,哪句勾起了你的回忆
  11. html id 重复,Apple ID一直重复登录无效!怎么处理!
  12. app 登录成功后 保存登录账号 密码 以及读取
  13. pyecharts全国地图和省级地图和水滴图
  14. NRF52832官方SDK介绍
  15. 深入浅出学算法——n个1(整除求余的优化)
  16. 神奇英语语法系列(四)——非谓语
  17. 移动CRM产品你选对了吗?四款入门平台推荐
  18. 毫秒级精度计划任务管理、系统运维管理、定时执行任务、定时任务执行、任务定时执行软件 —— 定时执行专家
  19. js 事件阻止传播方法,准确定位事件源
  20. 为飞机设计一款智能的黑匣子(针对过去飞机失事后飞机黑匣子的致命缺陷,如:马航370飞机失事若干年了,至今未有音信,飞机失事后黑匣子的安全和稳定性)

热门文章

  1. python与vb可以互换吗_VB6+Python混合编程(COM组件)(转)
  2. HighCharts:为plotLines基准线添加label标签不显示
  3. Swiper:基础学习
  4. ios调用restful接口_iPhone中调用RESTFUL Service
  5. bootstrap-table动态合并相同行和列的方法
  6. sql语句区分大小写吗?
  7. 微信公号“架构师之路”学习笔记(二)-高可用高并发负载均衡的架构设计(冗余+自动故障转移、水平扩展等)
  8. LIO-SAM探秘第二章之安装编译与参数配置
  9. JSON 解析之 FastJson
  10. QT 5 初学1 多窗口切分-续