归并排序:

排序原理:

1、尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,知道拆分后的每个子组的元素个数是1为止。

2、将相邻的两个子组进行合并成一个有序的大组

3、不断重复步骤2,直到最终只有一个组为止


代码实现:

package demo02.sort;//排序代码
public class Merge {private static Comparable[] assist;//归并所需要的辅助数组/*对数组a中的元素进行排序*/public static void sort(Comparable[] a) {assist = new Comparable[a.length];int lo = 0;int hi = a.length-1;sort(a, lo, hi);}/*对数组a中从lo到hi的元素进行排序*/private static void sort(Comparable[] a, int lo, int hi) {if (hi <= lo) {return;}int mid = lo + (hi - lo) / 2;//对lo到mid之间的元素进行排序;sort(a, lo, mid);//对mid+1到hi之间的元素进行排序;sort(a, mid+1, hi);//对lo到mid这组数据和mid到hi这组数据进行归并merge(a, lo, mid, hi);}/*对数组中,从lo到mid为一组,从mid+1到hi为一组,对这两组数据进行归并*/private static void merge(Comparable[] a, int lo, int mid, int hi) {//lo到mid这组数据和mid+1到hi这组数据归并到辅助数组assist对应的索引处int i = lo;//定义一个指针,指向assist数组中开始填充数据的索引int p1 = lo;//定义一个指针,指向第一组数据的第一个元素int p2 = mid + 1;//定义一个指针,指向第二组数据的第一个元素//比较左边小组和右边小组中的元素大小,哪个小,就把哪个数据填充到assist数组中while (p1 <= mid && p2 <= hi) {if (less(a[p1], a[p2])) {assist[i++] = a[p1++];} else {assist[i++] = a[p2++];}}//上面的循环结束后,如果退出循环的条件是p1<=mid,则证明左边小组中的数据已经归并完毕,如果退出循环的条件是p2<=hi,则证明右边小组的数据已经填充完毕;//所以需要把未填充完毕的数据继续填充到assist中,//下面两个循环,只会执行其中的一个while(p1<=mid){assist[i++]=a[p1++];}while(p2<=hi){assist[i++]=a[p2++];}//到现在为止,assist数组中,从lo到hi的元素是有序的,再把数据拷贝到a数组中对应的索引处for (int index=lo;index<=hi;index++){a[index]=assist[index];}}/*比较v元素是否小于w元素*/private static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a, int i, int j) {Comparable t = a[i];a[i] = a[j];a[j] = t;}
}
package demo02.test;
import demo02.sort.Merge;
import java.util.Arrays;
public class TestMerge {public static void main(String[] args) throws Exception {Integer[] arr = {8, 4, 5, 7, 1, 3, 6, 2};Merge.sort(arr);System.out.println(Arrays.toString(arr));}
}

运行结果:


归并排序时间复杂度分析:

归并排序是分治思想的最典型的例子,上面的算法中,对a[lo…hi]进行排序,先将它分为a[lo…mid]和a[mid+1…hi]
两部分,分别通过递归调用将他们单独排序,最后将有序的子数组归并为最终的排序结果。该递归的出口在于如果
一个数组不能再被分为两个子数组,那么就会执行merge进行归并,在归并的时候判断元素的大小进行排序。

归并排序的时间复杂度为:log2(n)* 2^(log2(n))=log2(n)*n,根据大O推导法则,忽略底
数,最终归并排序的时间复杂度为O(nlogn);


归并排序的缺点:

需要申请额外的数组空间,导致空间复杂度提升,是典型的以空间换时间的操作。

归并排序--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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 虚拟化云计算平台Proxmox VE
  2. 【Redis系列】面试官:Redis中的数据已经过期,为什么还占用这内存?
  3. 大数据互联网架构阶段 Linux下安装mysql启动的常见问题
  4. Javascript基础学习20问(二)
  5. Photoshop平面设计:网页设计之论摹仿和抄袭——xiame.com
  6. 南京地铁行业发展策略与运营建设规模分析报告2022版
  7. 【转载】冗余与热备的概念区别
  8. 冷色系清新调、日系清新调 、电影色调复古风、欧美风复古,用曲线就可以调了!!!...
  9. Python3操作EXCEL,取汉字首字母,拼接全拼
  10. Eclipse 代码大小写切换
  11. 小米3c路由器拆机_路由器也智能,小米路由器3C使用心得 - IT168试客
  12. 戴尔笔记本电脑USB口失灵
  13. 线性表之线性表与数组的区别
  14. 【大气湍流强弱的划分】
  15. 微信直播聊天室单房间1500万在线的消息架构演进之路
  16. 射频芯片工作的心脏——晶振
  17. Activity(一)—— Activity的启动流程
  18. 助眠好物排行榜,有了这些就不怕睡不着了
  19. ubuntu远程连接练习:
  20. nbiot和2g_Nbiot哪家运营商做的最好?

热门文章

  1. linux修图,修图只知道Photoshop?11款高逼格修图工具快来get!
  2. 保存文件_wps文件保存在哪里
  3. python 正则表达式 sub_python 正则表达式 re.sub re.subn
  4. vue实现查询多条记录_vue.js 实现天气查询
  5. python日期迭代_计算敏捷项目中迭代时间安排(Python3版)
  6. 施工部署主要不包括_专项施工方案编制至少应该包括以下内容及管片选型主要依据以下原则...
  7. java拓展接口_Java拓展接口-default关键词
  8. UC浏览器怎么删除收藏历史?UC浏览器删除收藏历史的操作方法
  9. C++17新特性之std::string_view
  10. can总线报文是固定的吗_新能源汽车CAN总线Bus Off处理流程