基本思想:

  归并排序法是分治法的典型实例,分为分割和归并两部分。

  把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并)。

 实例:

  先分割成每个子序列只有一个元素,然后再两两归并。

  

 归并排序是稳定的排序算法,时间复杂度为:O(NlogN).

 Java实现:

package sort;

public class MergeSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
new MergeSort().run();
}
public void run(){ int a[] = {,,,,,,,};
int len = a.length;
sort(a,,len-);
for(int i=;i<len;i++){
System.out.print(a[i]+" ");
}
}
/**
* 归并排序 稳定的
* 基本思想
* 将两个或两个以上有序表合并成一个新的有序表
* 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列
*/
public void sort(int arr[],int low,int high){
if(low == high){
return;
}
int mid = (low+high)/;
if(low<high){
/**
* 对左边排序
*/
sort(arr,low,mid);
/**
* 对右边排序
*/
sort(arr,mid+,high);
/**
* 左右归并
*/
merge(arr,low,mid,high);
}
}
public void merge(int[] arr,int low,int mid,int high){
int [] temp = new int[high-low+];
/**
* 左指针
*/
int i = low;
/**
* 右指针
*/
int j = mid+;
int k=;
/**
* 先把较小的数移到新数组中
*/
while(i<=mid && j<=high){
if(arr[i]<arr[j]){
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
}
}
/**
* 把左边剩余的数移入新数组
*/
while(i<=mid){
temp[k++] = arr[i++];
}
/**
* 把右边剩余的数移入新数组
*/
while(j<=high){
temp[k++] = arr[j++];
}
/**
* 用新数组中的数覆盖arr数组
*/
for(int k2=;k2<temp.length;k2++){
arr[k2+low] = temp[k2];
}
}
}

 结果展示:

  (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

排序系列 之 归并排序算法 —— Java实现的更多相关文章

  1. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

  2. 排序系列 之 堆排序算法 —— Java实现

       基本概念: 二叉堆是完全二叉树或者是近似完全二叉树. 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆. 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆. 一般将二叉堆简称 ...

  3. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  4. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  5. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  6. 【排序算法】归并排序算法 Java实现

    归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 基本思想 可以将一组数组分成A,B两组 依次类推,当分出来的小组只有一 ...

  7. 归并排序算法-Java实现

    简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...

  8. 归并排序算法Java实现

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

  9. JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的 ...

随机推荐

  1. python函数参数的区别

    在运用python的过程中,发现当函数参数为list的时候,在函数内部调用list.append()会改变形参,与C/C++的不太一样,查阅相关资料,在这里记录一下. python中id可以获取对象的 ...

  2. centos 7 配置nginx

    安装nginx: curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0. ...

  3. $.extend 合并对象(处理可传入0个或多个参数)

    function test(options){             $.extend({ },this.Default,options);                  var v = thi ...

  4. IntelliJ IDEA之windows下载安装、卸载

    系统要求 系统支持:Microsoft Windows 8 / 7 / Vista / 2003 / XP(每个系统版本的 32 位和 64 位都可以) JDK 版本:Oracle JDK 1.6 或 ...

  5. Django - ORM实现用户登陆

    1.路由分发cmdb(app)下urls.py中,建立url与函数对应关系 2.login.html代码: 3.views.py中,login函数,确认是否登陆成功 备注:从前端 获取用户名,密码,在 ...

  6. enote笔记语言(4)

    what:我想知道某个“关键词(keyword)”(即,词语,可以是概念|专业术语|.......)的定义. why:我想知道事物发生的原因:我会不会犯“归因错误”?是“单因素”的还是“多因素”的原因 ...

  7. MySQL之索引以及正确使用索引

    一.MySQL中常见索引类型 普通索引:仅加速查询 主键索引:加速查询.列值唯一.表中只有一个(不可有null) 唯一索引:加速查询.列值唯一(可以有null) 组合索引:多列值组成一个索引,专门用于 ...

  8. 【codeforces 701C】They Are Everywhere

    [题目链接]:http://codeforces.com/contest/701/problem/C [题意] 让你选择一段最短的区间; 使得这段区间里面包含所有种类的字符; [题解] 之前都是用二分 ...

  9. git 拉取远程分支 --本地分支不存在

    git checkout -b 本地分支名 origin/远程分支名

  10. wmpnetwk.exe怎么禁启动

    Win7控制面板--管理工具--服务,找到并选中"Windows Media Player Network Sharing Service"服务,右键点"属性" ...