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

1)划分子表

2)合并半子表

首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引中点(mid)为分界线,以下面一个序列为例

7,10,19,25,12,17,21,30,48

这样的一个序列中,分为两个子序列 7,10,19,25  和 12,17,21,30,48,如下图所示:

再使用归并算法的时候的步骤如下:

第一步:比较v[indexA]=7和v[indexB]=12,将较小的v[indexA]取出来放到临时向量tempArray中,然后indexA加1 

第二步:比较v[indexA]=10和v[indexB]=12,将较小的10放到临时变量tempArray中,然后indexA++;

第三步:比较v[indexA]=19与v[indexB]=12,将较小的12存放到临时变量tempArray中,然后indexB++;

第四步到第七步:按照以上规则,进行比对和存储,得到如下结果:

最后一步:将子表b中剩余项添加到临时向量tempArray中 

然后将临时变量中的值按照索引位置,拷贝回向量v中,就完成了对向量v的归并排序

java代码实现:

所有函数共用一个临时数组temp,每次都new一个临时数组开销太大

package org.conan.myhadoop.mr;import java.util.Arrays;public class MergeSort {  public static int[] sort(int[] array, int low, int high,int[] temp) {  int mid = (low + high) / 2;  if (low < high) {  // 左边  sort(array, low, mid,temp);  // 右边  sort(array, mid + 1, high,temp);  // 左右归并  merge(array, low, mid, high,temp);  }  return array;  }  public static void merge(int[] array, int first, int mid, int last,int[] temp) {  int i = first, j = mid + 1;  int m = mid,   n = last;  int k = 0;  // 把较小的数先移到新数组中  while (i <= m && j <= n)  {  if (array[i] <= array[j])  temp[k++] = array[i++];  else  temp[k++] = array[j++];  }  // 把左边剩余的数移入数组   while (i <= m)  temp[k++] = array[i++];  // 把右边边剩余的数移入数组    while (j <= n)  temp[k++] = array[j++];  // 把临时数组中的数覆盖array数组      for (i = 0; i < k; i++)  array[first + i] = temp[i];  }  // 归并排序的实现  public static void main(String[] args) {  int[] array = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };  int[] temp=new int[array.length];MergeSort.sort(array, 0, array.length-1,temp);  System.out.println(Arrays.toString(array));  }  }

参考文章:

http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html

http://blog.csdn.net/morewindows/article/details/6678165/

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1698530

排序算法之归并排序(JAVA)相关推荐

  1. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  2. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  3. java 奇偶数据排序算法,简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现 奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] ...

  4. 排序算法总结和java实现

    排序算法总结和java实现 0.排序算法说明 0.1 排序的定义 0.2 术语说明 0.3 算法总结 0.4 算法分类 0.5 比较和非比较的区别 1.冒泡排序 1.1 算法描述 1.2 动图演示 1 ...

  5. 选择排序算法(基于Java实现)

    title: 选择排序算法(基于Java实现) tags: 选择算法 选择排序算法原理及代码实现: 一.选择排序算法的原理 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间.但是选择 ...

  6. 桶排序算法(基于Java实现)

    title: 桶排序算法(基于Java实现) tags: 桶排序算法 桶排序算法的原理和代码实现 一.桶排序算法的原理 桶排序,顾名思义,会用到"桶",核心思想是将要排序的数据分到 ...

  7. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  8. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  9. 插入排序算法 java_排序算法实现-插入排序(Java版本)

    原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...

最新文章

  1. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容...
  2. SAP Business One
  3. AngularJS分层开发
  4. python基础知识学习笔记(2)
  5. iframe多层嵌套时获取元素总结
  6. python网络-多进程(21)
  7. vue 按钮根据状态切换_一个vue实现的标尺插件 - vue-sketch-ruler
  8. testng 组_TestNG组
  9. mac详细的系统信息怎么查看?
  10. (马世龙)Linux下CACTI完全搭建技术文档一
  11. 啦啦外卖独立版41.4+全插件+可运营版本+开源(亲测100%可用)
  12. bp神经网络优化算法对比,提高bp神经网络精度
  13. 小观matlab插值函数
  14. WTL入门(五) 自定义控件
  15. 游戏服务器应该怎么选择
  16. android开发找不到模拟器(PANIC: Could not open:)解决办法
  17. 古人用计算机计算图片,人类最早的计算器《算表》如何帮助古人完成计算?
  18. WSL2配置docker和PHP
  19. laravel 微信授权登录
  20. 如何做好企业级存储产品的测试

热门文章

  1. v-viewer图片打不开一直在刷新_网速很慢甚至打不开?广告弹窗太多了?有效提升网络质量的方法。...
  2. 逍遥android模拟器设置,逍遥安卓模拟器最佳设置电脑上玩手游流畅不卡多开更好用...
  3. C++安全方向openssl(一):1.2 Linux下编译openssl3.0并编写测试项目
  4. 解码(三):AVFrame格式解析和空间处理函数
  5. 计算机网络技术与应用应用题,计算机网络技术与应用题库答案.pdf
  6. python十大必备知识_学Python必备的基础知识
  7. java 正则表达式
  8. 1.5不同类型的循环神经网络
  9. Numpy Scalars(标量)
  10. Pandas dtypes(数据类型)