Java实现归并排序

本文转自https://www.cnblogs.com/of-fanruice/p/7678801.html

  归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。

一、两路归并排序算法思路

分而治之(divide - conquer);每个递归过程涉及三个步骤
第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.
第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作
第三, 合并: 合并两个排好序的子序列,生成排序结果.

二、算法实现
  此算法的实现不像图示那样简单,现分三步来讨论。首先从宏观上分析,首先让子表表长 L=1 进行处理;不断地使 L=2*L ,进行子表处理,直到 L>=n 为止,把这一过程写成一个主体框架函数 mergesort 。然后对于某确定的子表表长 L ,将 n 个记录分成若干组子表,两两归并,这里显然要循环若干次,把这一步写成一个函数 mergepass ,可由 mergesort 调用。最后再看每一组(一对)子表的归并,其原理是相同的,只是子表表长不同,换句话说,是子表的首记录号与尾记录号不同,把这个归并操作作为核心算法写成函数 merge ,由 mergepass 来调用。假设我们有一个没有排好序的序列,那么首先我们使用分割的办法将这个序列分割成一个一个已经排好序的子序列,然后再利用归并的方法将一个个的子序列合并成排序好的序列。分割和归并的过程可以看下面的图例。

三、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static int[] sort(int[] a,int low,int high){
        int mid = (low+high)/2;
        if(low<high){
            sort(a,low,mid);
            sort(a,mid+1,high);
            //左右归并
            merge(a,low,mid,high);
        }
        return a;
    }
     
    public static void merge(int[] a, int low, int mid, int high) {
        int[] temp = new int[high-low+1];
        int i= low;
        int j = mid+1;
        int k=0;
        // 把较小的数先移到新数组中
        while(i<=mid && j<=high){
            if(a[i]<a[j]){
                temp[k++] = a[i++];
            }else{
                temp[k++] = a[j++];
            }
        }
        // 把左边剩余的数移入数组 
        while(i<=mid){
            temp[k++] = a[i++];
        }
        // 把右边边剩余的数移入数组
        while(j<=high){
            temp[k++] = a[j++];
        }
        // 把新数组中的数覆盖nums数组
        for(int x=0;x<temp.length;x++){
            a[x+low] = temp[x];
        }
    }

四、算法分析

(1)稳定性
      归并排序是一种稳定的排序。
(2)存储结构要求
     可用顺序存储结构。也易于在链表上实现。
(3)时间复杂度
     对长度为n的文件,需进行趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。
(4)空间复杂度
     需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。
  注意:
     若用单链表做存储结构,很容易给出就地的归并排序

转载于:https://www.cnblogs.com/panxuejun/p/8796453.html

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

  1. Java实现归并排序 Merge Sort

    本文带来八大排序算法之归并排序算法. 归并排序是利用归并思想实现的排序算法,该算法采用经典的分治DAC(divide - and - conquer)策略.分治法将问题分(divide)成一些小的问题 ...

  2. java的归并排序算法_归并排序算法Java实现

    一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...

  3. [转载] Java实现归并排序(超详细,新手请进)

    参考链接: Java中将数组合并为的新数组 归并排序 大家好,这是我第一次在CSDN上写东西,因为我一直觉得有需要就去找别人的blog看看就好,但我发现自己写出来的东西确实能加深记忆.我半路出家,属实 ...

  4. 分治法在排序算法中的应用(JAVA)--归并排序

    分治法最常用的就是将规模为n的实例划分成两个n规模为n/2的实例 .推广到一般的情况,我们可以将规模为n的实例划分为b个规模为n/b的实例.这样对于算法的运行时间存在递推式:T(n) = aT(n/b ...

  5. 用java实现归并,算法:JAVA实现归并排序

    1.核心思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序. 若将两个有序 ...

  6. 【Java】 归并排序的非递归实现

    归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...

  7. java多线程归并排序_并行计算实验-串、并行排序算法

    并行实验报告 一.项目背景 项目要求实现快速排序.枚举排序.归并排序三种排序方法的串行和并行算法,并且进行性能比较和优化分析.其中数据集`random.txt`,当中包含30000个乱序数据,数据的范 ...

  8. Java实现归并排序-有图有真相

    归并排序 1.原理 归并排序是一种概念上最简单的排序算法,与快速排序一样,归并排序也是基于分治法的.归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列 ...

  9. java 二路归并排序_java二路归并排序示例分享

    归并排序就是采用分治法进行排序: (1)将一个数组分成小的2个数组分别进行排序: (2)之后将分出来的已经拍好序的数组进行合并: import java.util.scanner; public cl ...

  10. java线程归并排序_Java-归并排序 - FeanLau的个人空间 - OSCHINA - 中文开源技术交流社区...

    public class MergeSort { static int number=0; public static void main(String[] args) { int[] a = {26 ...

最新文章

  1. hadoop学习之一
  2. 《罗永浩打脸罗永浩》、MPEG召集人辞职称MPEG将不再存在、Zoom免费用户将没有端到端加密|Decode the Week...
  3. SecurtCRT连接服务器自动断开
  4. 大动作!华为海思注册资本从6亿增加到20亿
  5. c语言写os 编译器,你真的懂''Hello world''吗?从编译器到OS内核系列:编译器基本概念...
  6. arduino analogread_Arduino编程语言教程,Arduino和单片机的区别
  7. mac charles4.0.2免费破解版安装
  8. 论文阅读汇总(4)-【篇数:50】
  9. win10家庭版优化
  10. 念在天涯,心在咫尺【转载】
  11. 国家高新技术企业认定要求及快速通过的方法
  12. 电源知识——LDO线性电源、开关电源(基础)
  13. Mysql 为什么默认定义varchar(255) 而不是varchar(256)
  14. 计算机网络(第7版) - 第八章 互联网上的音频/视频服务 - 习题
  15. 安卓 build.prop 进行修改提高性能
  16. [Web前端基础] CSS优先级、JS运算优先级、CSS设置在第几行进行超出部分省略号、JS设置元素样式的六种方式
  17. iOS代码设置渐变背景色
  18. 怎样撰写论文中的结果和讨论
  19. div+css静态网页设计——动漫电影《你的名字》(7页) HTML+CSS+JavaScript 学生DW网页设计作业成品 html网页设计期末大作业_网页设计平时作业
  20. 一款好用的智能餐饮会员收银系统该具备哪些功能?

热门文章

  1. unsatisfied condition: __STDC_VERSION__ = 201112L
  2. 编译OpenJDK12:freetypeScaler.obj error LINK2019 无法解析的外部符号
  3. FireFox的插件范例,竟然有问题
  4. 解决办法:对BZ2_bzDecompressInit/BZ2_bzDecompress/BZ2_bzDecompressEnd未定义的引用
  5. 导航可与红绿灯结合起来
  6. 管理感悟:公司内斗,肯定是闲着的斗干活的
  7. 期待人工智能在合作时的表现
  8. 微星主板不用DrMOS了?
  9. win7系统网络计算机,Win7系统打开局域网没看到其他计算机的修复方法
  10. 简述python_python 入门简述