一. 算法描述

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

归并排序将待排序数组A[1..n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列。具体排序过程如下图所示:

归并排序中一个很重要的部分是两个已排序序列合并的过程,这里需要另外开辟一块新的空间来作为存储这两个已排序序列的临时容器。假设对A[p..r]序列进行合并,已知A[p..q]及A[q+1..r]为已排序的序列,合并的具体步骤为:

Step 1:新建两个数组L、R分别存储待合并序列A[p..q]和A[q+1..r],将待排序序列中的对应元素copy到L和R中,L和R最后设置一个极大值作为“哨兵”;

Step 2:令指针i指向L的起始元素,j指向R的起始元素,k指向A待合并部分的起始元素A[p];

Step 3:若L[i]≤R[j],令A[k]=L[i],i=i+1,k=k+1;

否则,令A[k]=R[j],j=j+1,k=k+1;

(这一步即依次比较i、j所指向的元素,将较小值依次放入到A中相应位置。)

Step 4 :重复Step 3,r-p+1次后停止,即依次确定A[p..q]每个位置上的元素。

经过合并操作后,A[p..q]为一个有序序列。若待合并序列为(38, 49, 65, 97, 13, 27, 49, 76),p=1,q=4,, r=8,即A[1..4]和A[5..8]分别为有序序列,则合并操作的具体过程如下图所示:

package com.neuedu.algorithm;

import java.util.Arrays;

public class MergeSort {

//归并排序

/*归并排序采用递归实现

* 分阶段可以理解为就是递归拆分子序列的过程、

* 治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],

* */

public static void main(String []args){

int []arr = {9,8,7,6,5,4,3,2,1};

sort(arr);

System.out.println(Arrays.toString(arr));

}

public static void sort(int []arr){

int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间

sort(arr,0,arr.length-1,temp);

}

private static void sort(int[] arr,int left,int right,int []temp){

if(left

int mid = (left+right)/2;

sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序

sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序

merge(arr,left,mid,right,temp);//将两个有序子数组合并操作

}

}

private static void merge(int[] arr,int left,int mid,int right,int[] temp){

int i = left;//左序列指针

int j = mid+1;//右序列指针

int t = 0;//临时数组指针

while (i<=mid && j<=right){

if(arr[i]<=arr[j]){

temp[t++] = arr[i++];

}else {

temp[t++] = arr[j++];

}

}

while(i<=mid){//将左边剩余元素填充进temp中

temp[t++] = arr[i++];

}

while(j<=right){//将右序列剩余元素填充进temp中

temp[t++] = arr[j++];

}

t = 0;

//将temp中的元素全部拷贝到原数组中

while(left <= right){

arr[left++] = temp[t++];

}

}

}

java的归并排序算法_归并排序算法Java实现相关推荐

  1. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  2. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  3. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  4. java的mergesort函数_归并排序 - Algorithms, Part I, week 3 MERGESORTS

    前言 本周讲解两个50多年前发明,但今天仍然很重要的经典算法 (归并排序和快速排序) 之一 -- 归并排序,几乎每个软件系统中都可以找到其中一个或两个的实现,并研究这些经典方法的新变革.我们的涉及范围 ...

  5. java 堆排序算法_堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...

  6. 全排列的java算法_全排列算法原理和实现

    评论 # re: 全排列算法原理和实现  回复  更多评论 #include #include #define CHESSNUM 9 using namespace std; /*********** ...

  7. java每日打卡_“365算法每日学计划”:03打卡-贪心算法

    自从开始做公众号开始,就一直在思考,怎么把算法的训练做好,因为思海同学在算法这方面的掌握确实还不够.因此,我现在想做一个"365算法每日学计划"."计划"的主要 ...

  8. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  9. java雪花数据库长度_雪花算法(SnowFlake)Java实现

    算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long ...

最新文章

  1. 物联网平台 源码_国内首个智慧交通物联网平台发布
  2. javascript:void(0)和javascript:;的用法
  3. SaltStack实战之配置管理-Jinja2模板
  4. P3527-[POI2011]MET-Meteors【整体二分,树状数组】
  5. 前端学习(2016)vue之电商管理系统电商系统vue-quill-editor
  6. linux ruby作用域,细说Ruby细化
  7. 深入理解java虚拟机_深入理解Java类加载
  8. 数据挖掘十大算法之Apriori算法
  9. 计算机上安装了更新ie版本,安装ie浏览器提示系统有更新的版本怎么办_ie提示有更新版本的解决方法...
  10. 九曲黄河万里沙,浪淘风簸自天涯 — 正则表达式
  11. LoadRunner教程06:录制测试脚本
  12. 如果将网络工程师分级你是那个级别?
  13. seafile专业版集成微软的office online实现在线协同编辑
  14. 服务器系统详细安装步骤
  15. 最新电脑cpu性能排行服务器,服务器cpu性能排行,教您服务器cpu性能排行
  16. 水果店开业活动,水果店开业活动策划
  17. 【OBS】解决OBS推两个rtmp流 + 带时间戳问题
  18. 很多做淘宝客的朋友会用到采集,那么怎么提取出淘宝商品id呢
  19. 机器学习:流形学习Manifold Learning之LLE(局部线性嵌入)
  20. 为期10年的里程碑式合作,IBM首台“零售”量子计算机将落户克利夫兰诊所

热门文章

  1. 关于 SAP CloudFoundry 应用的 Resilience
  2. SAP Spartacus 服务器端渲染的依赖注入之 ProductPageEventBuilder
  3. 如何通过调试找到自己需要的ABAP增强
  4. 2020年10月21日 星期三 工作日志
  5. 根据ABAP类方法的形式参数名,反查是哪个方法定义了该形式参数
  6. 使用JavaScript调用Microsoft XMLDOM库进行XML字符串的解析
  7. why I need register Apache CXF as servlet
  8. SAP CRM 订单抬头文本的可编辑性讨论
  9. 如何将Twitter消息导入到SAP CRM和Cloud for Customer去
  10. Extension project: 404 Not Found for resources/cus/crm/notes/ext/Component-dbg.js