当前位置: 首页 > news >正文

java-数据结构-归并排序

归并排序介绍

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

归并排序思想示意图

归并排序思想示意图1-基本思想:

在这里插入图片描述

归并排序思想示意图2-合并相邻有序子序列:

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤
归并排序思想示意图1-基本思想
归并排序思想示意图2-合并相邻有序子序列

归并排序代码

package com.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MergetSort {

	public static void main(String[] args) {
		//int arr[] = { 8, 4, 5, 7, 1, 3, 6, 2 }; //
		
		//测试快排的执行速度
		// 创建要给80000个的随机的数组
		int[] arr = new int[8000000];
		for (int i = 0; i < 8000000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}
		System.out.println("排序前");
		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("排序前的时间是=" + date1Str);
		
		int temp[] = new int[arr.length]; //归并排序需要一个额外空间
 		mergeSort(arr, 0, arr.length - 1, temp);
 		
 		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("排序前的时间是=" + date2Str);
 		
 		//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);
			
		}
	}
	
	//合并的方法
	/**
	 * 
	 * @param arr 排序的原始数组
	 * @param left 左边有序序列的初始索引
	 * @param mid 中间索引
	 * @param right 右边索引
	 * @param temp 做中转的数组
	 */
	public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
		
		int i = left; // 初始化i, 左边有序序列的初始索引
		int j = mid + 1; //初始化j, 右边有序序列的初始索引
		int t = 0; // 指向temp数组的当前索引
		
		//(一)
		//先把左右两边(有序)的数据按照规则填充到temp数组
		//直到左右两边的有序序列,有一边处理完毕为止
		while (i <= mid && j <= right) {//继续
			//如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素
			//即将左边的当前元素,填充到 temp数组 
			//然后 t++, i++
			if(arr[i] <= arr[j]) {
				temp[t] = arr[i];
				t += 1;
				i += 1;
			} else { //反之,将右边有序序列的当前元素,填充到temp数组
				temp[t] = arr[j];
				t += 1;
				j += 1;
			}
		}
		
		//(二)
		//把有剩余数据的一边的数据依次全部填充到temp
		while( i <= mid) { //左边的有序序列还有剩余的元素,就全部填充到temp
			temp[t] = arr[i];
			t += 1;
			i += 1;	
		}
		
		while( j <= right) { //右边的有序序列还有剩余的元素,就全部填充到temp
			temp[t] = arr[j];
			t += 1;
			j += 1;	
		}
		
		
		//(三)
		//将temp数组的元素拷贝到arr
		//注意,并不是每次都拷贝所有
		t = 0;
		int tempLeft = left; // 
		//第一次合并 tempLeft = 0 , right = 1 //  tempLeft = 2  right = 3 // tL=0 ri=3
		//最后一次 tempLeft = 0  right = 7
		while(tempLeft <= right) { 
			arr[tempLeft] = temp[t];
			t += 1;
			tempLeft += 1;
		}
		
	}

}

相关文章:

  • java-数据结构-基数排序(桶排序)
  • java-数据结构-顺序查找
  • java-数据结构-二分查找(折半查找)
  • java-数据结构-插值查找
  • java-数据结构-前中后序遍历
  • java-数据结构-前中后序查找
  • java-数据结构-顺序存储二叉树
  • java-数据结构-线索化二叉树
  • java-数据结构-大顶堆和小顶堆
  • java-数据结构-赫夫曼树(Huffman Tree)
  • java-数据结构-哈夫曼编码(Huffman Coding)
  • java批量修改文件名工具类
  • deepin安装后wps提示缺少字体
  • Unknown initial character set index '45' received from server
  • 阿里云maven公共代理库
  • 网络传输文件的问题
  • __proto__ 和 prototype的关系
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 30秒的PHP代码片段(1)数组 - Array
  • express.js的介绍及使用
  • GraphQL学习过程应该是这样的
  • java2019面试题北京
  • js 实现textarea输入字数提示
  • laravel with 查询列表限制条数
  • MD5加密原理解析及OC版原理实现
  • Meteor的表单提交:Form
  • mysql innodb 索引使用指南
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Webpack 4x 之路 ( 四 )
  • windows下如何用phpstorm同步测试服务器
  • 讲清楚之javascript作用域
  • 每天一个设计模式之命令模式
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用Gradle第一次构建Java程序
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用简单代码看卷积组块发展
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • python最赚钱的4个方向,你最心动的是哪个?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​批处理文件中的errorlevel用法
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (03)光刻——半导体电路的绘制
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)选择元素——(17)练习(Exercises)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (九)信息融合方式简介
  • (五)c52学习之旅-静态数码管
  • (学习日记)2024.01.09
  • (转)EOS中账户、钱包和密钥的关系
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库