1.在讲归并排序之前,我们先复习一下数据结构的基础知识

1.数据元素是数据的基本单位,一个数据元素可以是一个不可分割的原子项,也可由多个数据项组成。

2. 数据的逻辑结构主要可分为3种:线性结构(定义数据元素之间是线性关系),树结构(定义数据元素(结点)之间是层次关系),图结构(则通过图形顶点与边构成的一种结构)。

3.算法的5个基本特性:有穷性,确定性,可行性,有输入,有输出。

4.算法应满足的5个目标:正确性,健壮性,高时间效率性(根据执行算法的时间来判断程序的执行效率),高空间性(根据执行算法占用的空间,来判断程序的执行效率) ,可读性。

5.算法的优劣主要从时间代价和空间代价来判断:

时间复杂度关系: O(1)<O(log2^n)<O(n)<O(nlog2^n)<O(n^2)<O(n^3)<O(2^n),时间复杂度越小代表该算法执行的效率高,反之亦然,我们在解决的问题当中,不要选择for循环暴力破解,通过那种方式虽然能解决问题,但是占用的时间太多,我们应该通过别的方式去解决,用空间换时间 用时间换空间都是在不停的更替来使用,目的就是为了追求程序的最优解,就就是算法的魅力所在吧。

空间复杂程度我在这里就不一一讲解了。

2.接下来我们步入今天的正题,归并排序:

        归并排序的思想是:分而治之,分通俗的讲就是将问题分成一个个小的问题,然后通过递归的方式求解,让每的一个元素按照规则出到栈顶;治是归并排序的最重要一步,将分的阶段得到的结果整理放在一起。归并排序的时间复杂度是:nlog2^n

 简单的图示:

3.下面就是归并排序的代码实现:

/*** Created with IntelliJ IDEA.** @Author: chenxiky* @Date: 2022/02/16/0:14* @Description: 归并排序*/
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];mergeSort(arr,0,arr.length-1,temp);System.out.println("归并排序="+ Arrays.toString(arr));}// 分+合方法public static void mergeSort(int[]arr,int left,int right,int[] temp){if (left < right){int mid = (left + right)/2;  // 中间的索引// 向左递归进行分解mergeSort(arr, left, mid, temp);// 向右递归进行分解mergeSort(arr, mid+1, right, temp);//合并merge(arr,left,mid,right,temp);}}/*** 合并的方法* @param arr 原始数组* @param left 左边有序序列的初始索引* @param mid  中间索引* @param right 右边索引* @param temp  做中转的数组*/public static void merge(int[] arr,int left,int mid,int right,int[] temp){// 计算进行了多少次归并System.out.println("xxxx");int i = left;  // 初始化i,左边有序序列的初始索引int j = mid+1; // 初始化j,右边有序序列的初始索引int t = 0;     //指向temp数组的当前索引// 第一步// 先把左右两边(有序)的数据按照规则填充到temp数组// 直到左右两边的有序序列,有一边处理完毕为止while (i <= mid && j <= right){// 如果左边有序序列的当前元素 小于等于右边有序序列的当前元素// 即将左边的当前元素拷贝到temp数组// t++;i++;  +1操作if (arr[i] <= arr[j]){temp[t] = arr[i];t++;  //i++;} else {  // 反之将右边的有序序列的当前元素,填充到temptemp[t] = arr[j];t++;j++;}}//第二步//把有剩余的数据的一边的数据依次全部填充到tempwhile (i <= mid){ //左边的有序序列还有剩余的元素,就全填充到temptemp[t] = arr[i];t++;i++;}while (j <= right){ //右边的有序序列还有剩余的元素,就全填充到temptemp[t] = arr[j];t++;j++;}//第三步//将temp数组的元素拷贝到arr// 注意,并不是每次到拷贝所有的t =0;int tempLeft = left;// 第一次合并时tempLeft=0,right = 3;while (tempLeft <= right){arr[tempLeft] = temp[t];t++;tempLeft++;}}
}

文中若有错的地方,请大家多多见谅。如果大家觉得我的内容有收获可以点击关注哦,同时也可以关注我的公众号: 晨溪

归并排序(java实现)相关推荐

  1. 堆排序和归并排序 java代码实现

    文章目录 堆排序 java代码实现 单元测试 归并排序 java代码实现 单元测试 堆排序 java代码实现 package csdn.dreamzuora.sort;import java.util ...

  2. 排序算法之归并排序(JAVA)

    归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并 ...

  3. 归并排序Java实现

    归并排序Java实现 public class MergeSort {public static void sort(int[] a,int left, int right){if(left > ...

  4. 归并排序--Java

    归并排序: 排序原理: 1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,知道拆分后的每个子组的元素个数是1为止. 2.将相邻的两个子组进行合并成一个有序的大组 3.不断重复步骤2 ...

  5. 归并排序——java

    import java.util.Arrays; public class Cao46 { /** * @归并排序 * * 三个指针:两个指针最初位置分别为两个已经排序序列的起始位置,第三个指针两个序 ...

  6. 归并排序Java详解+例题

    归并排序->分治 归并排序 归并排序->分治 背景 归并原理与过程 原理: 过程 图形展示 模板代码 模板讲解 归并例子 完整java代码 背景 归并排序是十大排序之一 十大排序: 归并原 ...

  7. 归并排序 java实现_归并排序的java实现

    归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...

  8. 归并排序 java 迭代_经典排序算法之归并排序(示例代码)

    归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 (大O符号).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide an ...

  9. 归并排序的java语言_归并排序 java语言

    /* * 归并排序算法 */ public class MergeSort { final static int MAX=0x7FFFFFFF; public static void main(Str ...

  10. 912. 排序数组——归并排序Java时间复杂度空间复杂度稳定性分析

    目录 1.题目 2.思路 归并排序--nlogn 思想--递归 代码 时间复杂度--O(nlogn) 空间复杂度--O(n) 稳定性--稳定 3.结果 1.题目 2.思路 这个题可以作为练习手写各种排 ...

最新文章

  1. LigerUI权限系统之组织结构
  2. SAP SD基础知识之SD常见流程概述
  3. 单片机I/O口推挽输出与开漏输出的区别(open-drain与push-pull)
  4. 小白html图片添加文字,小白爬虫入门——爬取图片和文字(超详细)
  5. OpenCV创建校准图案calibration pattern
  6. java项目(java project)如何导入jar包的解决方案列表
  7. Python3之socket编程(TCP/UDP,粘包问题,数据传输、文件上传)
  8. XHTML下css+div编写
  9. matlab求含参数一元三次方程,matlab 求解一元三次方程,带其他参数
  10. Chrome离线安装CRX插件方法
  11. [个人笔记] ssh-keygen和openssl工具的使用
  12. android红外接收api,关于安卓红外API:ConsumerIrManager类
  13. 微信视频压缩画质怎么办?微信发视频怎么不压缩画质
  14. 微信浏览器调用手机摄像头录像
  15. Tensorflow-- 第一天使用过程中的报错records
  16. 如何使用计算机对文件修改密码,怎么给文件夹设密码-加密文档及给它们修改删除密码的具体操作方法...
  17. 1. 树莓派的基础配置
  18. 系统安全与应用【上】
  19. Elasticsearch7.2中文文档翻译(一):Elasticsearch简介
  20. 13:Scala语言的数据结构和算法

热门文章

  1. abb变频器dp适配器说明书_ABB变频器使用说明书
  2. 焊接工时简便计算工具_2020年新版机械加工工时费用计算(17页)-原创力文档...
  3. 【保姆级教程】使用python实现SIR模型(包含数据集的制作与导入及最终结果的可视化)
  4. secsetupwizard以停止_三星手机s3500c报价是多少【详细评测】
  5. html页面内容查找代码,网页源代码查看
  6. Java菜鸟教程 基本数据类型(一)
  7. wiznote can't networking
  8. 大学生创新创业基础章节答案(李家华等,2021版)
  9. 适应科技发展观的Steam教学实践
  10. 51单片机(1)-开发工具介绍及软件安装