二路归并排序:
其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题。即所谓“分而治之,万流归一”

二路归并排序的时间复杂度计算如下:

参考资料:算法导论------递归算法的时间复杂度求解

二路归并java实现:

 public class MergeSort {

     public static void main(String[] args) {
int [] array = {1,8,6,7,2,4,11,17,6,48,3};
//int [] array ={9,8,7,6,5,4,3,2,1};
int [] temp = new int [array.length];
sort(array, temp, 0, array.length - 1);
System.out.println("排序后:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
/**
* 总的sort循环。先将问题一分为二,再将问题解决后的两个子问题结果合并
* 要想清楚 子数组 边界的处理。
* 如子数组为 下标为(k,k + 1):则再分解为(K),(K+1)。
* 如子数组下标为(k,k+1,k+2):则分解为(k,k+1)和(k+2)。再递归调用分解(k,k+1)
* @param array
* @param temp
* @param start
* @param end
*/
public static void sort (int [] array, int [] temp, int start, int end){
if (start < end) {
int mid = (start + end)/2;
//解决左边子问题
sort(array, temp, start, mid);
//解决右边子问题
sort(array, temp, mid + 1, end);
//合并两个子问题
merge(array,temp,start,end,mid);
}
}
/**
* 归并函数
* @param array 原始数组
* @param temp 辅助数组
* @param start 归并开始坐标
* @param end 归并结束坐标
* @param mid = (start + end)/2
*/
public static void merge(int[] array, int[] temp, int start, int end, int mid) {
// TODO Auto-generated method stub
//i:左子问题的操作下标; j:右子问题的操作下标
int i = start;
int j = mid + 1;
int k = start;
while (i <= mid && j <= end){
if (array[i] < array[j]) {
temp[k] = array[i];
k++;
i++;
}else {
temp[k] = array[j];
k++;
j++;
}
}
//左子数组还有元素
while (i <= mid){
temp[k] = array[i];
k++;
i++;
}
//右子数字还是元素
while (j <= end){
temp[k] = array[j];
k++;
j++;
} //将辅助数组中排好序的元素复制到原数组
//注意:辅助数组与原数组一一对应
for (int index = start; index <= end; index ++){
array[index] = temp[index];
System.out.println("temp[" + index +"]" + "....." + temp[index]);
}
System.out.println("===============");
}
}

通过控制台输出,我们可以看到排序的过程:

temp[0].....1
temp[1].....8
===============
temp[0].....1
temp[1].....6
temp[2].....8
===============
temp[3].....2
temp[4].....7
===============
temp[3].....2
temp[4].....4
temp[5].....7
===============
temp[0].....1
temp[1].....2
temp[2].....4
temp[3].....6
temp[4].....7
temp[5].....8
===============
temp[6].....11
temp[7].....17
===============
temp[6].....6
temp[7].....11
temp[8].....17
===============
temp[9].....3
temp[10].....48
===============
temp[6].....3
temp[7].....6
temp[8].....11
temp[9].....17
temp[10].....48
===============
temp[0].....1
temp[1].....2
temp[2].....3
temp[3].....4
temp[4].....6
temp[5].....6
temp[6].....7
temp[7].....8
temp[8].....11
temp[9].....17
temp[10].....48
===============
排序后:
1 2 3 4 6 6 7 8 11 17 48

二路归并排序java实现的更多相关文章

  1. 归并排序—Java版

    一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...

  2. 二路归并排序的java实现

    转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html 参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之 ...

  3. 归并排序 求逆序数 链表的归并排序 多线程归并排序 java

    import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...

  4. 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现

    归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...

  5. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...

  6. 归并排序-java

    排序-归并排序 基本思想:是指将两个或两个以上的有序表合并成一个新的有序表. 具体步骤: (1首先将整个表看成是n个有序子表,每个子表的长度为1. (2)然后两两归并,得到n/2个长度为2的有序子表. ...

  7. 二路归并排序算法实现-完整C语言程序

    /*********************************************************************************************** 1.设 ...

  8. leetcode23 多个拍好序的链表进行归并排序 (java版本)

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  9. 归并排序java

    import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort ...

随机推荐

  1. Delphi XE7调用C++动态库出现乱码问题回顾

    事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致.以下是解决问题的过程: 我们C++中间件动态库 ...

  2. 深入虚拟内存(Virtual Memory,VM)

    我们应该知道物理内存(Physical Memory)指的是硬件上的内存,即 RAM.它通常指的是插在主板上的内存条,给进程提供临时数据存储的设备.因为 CPU 可以直接从物理内存中读取数据和指令,所 ...

  3. 21-[模块]-configparser

    1.configparser模块 此模块用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见配置文件格式如下 [DEFA ...

  4. HDU - 3874 Necklace (树状数组、离线处理)

    题目链接:Necklace 题意: 给出一串珠子,每个珠子有它的value,现在给出n(n<=5e4)个珠子的value(1<=value<=1e6),现在给出m(1<=m&l ...

  5. Python 学习 第五篇:语句和语法

    Python程序是语句构成的,语句包含表达式,表达式嵌套在语句中,包含变量和常量,用于处理对象.Python的语法实质上是由表达式.语句和代码块构成的.语句是由表达式构成的,代码块是由多个语句构成的复 ...

  6. c# ajax从后台获取数据list数组 $.each再显示数据

    后台代码 public JsonResult linkage(string Department) {//逻辑是:先从数据库查到表数据 再把表数据转换为LIST给AJAX HE_Department ...

  7. EVA无法连接

    EVA在11月19日更新后,发现DMS无法与EVA进行链接,在DMS中EVA连接测试报告中有如下报错:   根本原因   解决方法/修复 1.在本地电脑系统盘中查找文件夹“.eva-prod”, 并拷 ...

  8. Unity生成简易二维码

    最近项目需求,需要在Unity中动态生成二维码.所以就研究了一下,下面把动态生成二维码的方法向大家分享一下. 第一种方法 需要一个 ZXing.dll文件. 下载地址我会在文章结尾给出. 直接将下载好 ...

  9. Laya 1.x 按文件夹TS代码合并

    Laya 1.x 使用TS开发时,经常会碰到代码文件太多,加载index.html时时间太长的问题.Laya编辑器貌似没有自带JS代码合并的功能.基于Laya去实现JS合并需要修改编辑器源码,合并JS ...

  10. 高可用OpenStack(Queen版)集群-4.keystone集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...