Java 详细讲解分治算法如何实现归并排序

 更新时间:2022年04月06日 14:29:24   作者:求不脱发  
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解,本篇文章我们就用分治算法来实现归并排序

1.什么是分治算法

分治法

分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。

基本思想

分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

2.分治算法的体现——归并排序

归并排序

归并排序( MERGE - SORT )是利用归并的思想实现的排序方法,该算法采用经典的分治( divide - and - conquer )策略(分治法将问题分( divide )成一些小的问题然后递归求解,而治( conquer )的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。

基本思想

流程图(以对数组[8,4,5,7,1,3,6,2]排序为例)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGC5LiN6ISx5Y-R,size_20,color_FFFFFF,t_70,g_se,x_16

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将

[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGC5LiN6ISx5Y-R,size_20,color_FFFFFF,t_70,g_se,x_16

3.代码实现

package Sort;
 
import java.util.Arrays;
/**
 * 归并排序:
 * 
 * 利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,
 * 
 * 而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
 * @author lenovo
 *
 */
public class MergeSort {
	public static void main(String[] args) {
		int[] a= {5,8,6,3,9,8,7,1,4,21,-8,46};
		int[] temp=new int[a.length];
		mergeSort(a, 0, a.length-1, temp);
		System.out.println(Arrays.toString(a));
	}
	public static void mergeSort(int[] arr,int left,int right,int[] temp) {
		if(left<right) {
			int mid=(left+right)/2;
			mergeSort(arr, left, mid, temp);
			mergeSort(arr, mid+1,right, temp);
			merge(arr, left, mid, right, temp);
		}
	}
	public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
		int l=left;//左边序列的起始位置
		int r=mid+1;//右边序列的起始位置
		int t=0;//中间数组的当前元素下标
		while(l<=mid &&r<=right ) {//左边或右边没结束
			//那边小就将那边的元素放入到临时数组中
			if(arr[l]<=arr[r]) {
				temp[t++]=arr[l++];
			}else {
				temp[t++]=arr[r++];
			}
		}
		//while循环结束,说明有一边已经遍历完毕,将另一边剩余的元素放入到临时数组中
		while(l<=mid) {
			temp[t++]=arr[l++];
		}
		while(r<=right) {
			temp[t++]=arr[r++];
		}
		//将临时数组中的有序序列copy到原数组中
		t=0;
		int templeft=left;
		while(templeft<=right) {
			arr[templeft++]=temp[t++];
		}
	}
}

到此这篇关于Java 详细讲解分治算法如何实现归并排序的文章就介绍到这了,更多相关Java 归并排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java定时任务原理详解

    Java定时任务原理详解

    当下,java编码过程中,实现定时任务的方式主要以以下两种为主:spring框架的@Scheduled和quzrtz框架。本文主要就二者的框架原理实现做一个入门引导,为了解深层实现细节做一定的铺垫
    2022-07-07
  • java基础学习笔记之泛型

    java基础学习笔记之泛型

    所谓泛型,就是变量类型的参数化。泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。
    2016-02-02
  • Spring深入刨析声明式事务

    Spring深入刨析声明式事务

    在spring注解中,使用声明式事务,需要用到两个核心的注解:@Transactional注解和@EnableTransactionManagement注解。将@Transactional注解加在方法上,@EnableTransactionManagement注解加在配置类上
    2022-12-12
  • SpringBoot集成WebSocket的两种方式(JDK内置版和Spring封装版)

    SpringBoot集成WebSocket的两种方式(JDK内置版和Spring封装版)

    这篇文章主要介绍了SpringBoot集成WebSocket的两种方式,这两种方式为JDK内置版和Spring封装版,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 关于synchronized有趣的同步问题

    关于synchronized有趣的同步问题

    今天小编就为大家分享一篇关于关于synchronized有趣的同步问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 浅析Spring和MyBatis整合及逆向工程

    浅析Spring和MyBatis整合及逆向工程

    这篇文章主要介绍了Spring和MyBatis整合及逆向工程的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Java ArrayList 数组之间相互转换

    Java ArrayList 数组之间相互转换

    本文通过代码示例给大家讲解arraylist转化为数组,然后数组转化为arraylist的相关资料,感兴趣的朋友一起看看吧
    2015-11-11
  • SpringBoot SSMP 整合案例分享

    SpringBoot SSMP 整合案例分享

    这篇文章主要介绍了SpringBoot SSMP 整合案例分享,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 在项目中集成jetty server步骤解析

    在项目中集成jetty server步骤解析

    这篇文章主要介绍了在项目中集成jetty server步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 一篇文章了解Jackson注解@JsonFormat及失效解决办法

    一篇文章了解Jackson注解@JsonFormat及失效解决办法

    这篇文章主要给大家介绍了关于如何通过一篇文章了解Jackson注解@JsonFormat及失效解决办法的相关资料,@JsonFormat注解是一个时间格式化注解,用于格式化时间,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论