栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

八种基本排序问题 (第六篇 归并排序)图文详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

八种基本排序问题 (第六篇 归并排序)图文详解

一. 归并排序的描述

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

二. 归并的思想

1.先把数组进行分开  ,直到元素个数为一个时  ,

 2.然后进行合并 ,合并时两个相邻的有序子序列合并为一个序列

3.合并出的临时数组再赋值给原数组   

 

三. 代码实现
package c06Sort;

import java.util.Arrays;
//归并
public class c06MergetSort {

	public static void main(String[] args) {
		int [] arr = {8,4,5,7,1,3,6,2,4,0,6};
		int [] temp =new int [arr.length];
		mergeSort(arr, 0, arr.length-1, temp);
		System.out.println(Arrays.toString(arr));
		
	}
	
	
	//分+合 的方法
	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 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[t++]=arr[i++];
		}
		
		while(j<=right) {
			temp[t++]=arr[j++];
		}
		
		//第三 复制临时数据 
		//每次都是从出过来的left开始到right
		t = 0;  //临时数组的下标
		int templeft =left;
		while(templeft<=right) {
			arr[templeft++]=temp[t++];
		}
	}
	
	
}
四. 结果

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号