尚硅谷数据结构与算法(Java)--17--归并排序

Arduino Uno + TCRT5000传感器:手把手教你调出一个又快又稳的PID循迹小车(附完整代码) 本文详细介绍了如何使用Arduino Uno和TCRT5000传感器调校PID循迹小车,涵盖PID控制算法的理论实践、参数调优策略及硬件优化技巧。通过分阶段调参和动态参数调整,帮助读者实现小车在赛道上的高速稳定运行,并附有完整代码教程。 阅读详情

:归并排序 

  • 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
  • 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
  • 若将两个有序表合并成一个有序表,称为二路归并。 

 图片链接https://www.runoob.com/wp-content/uploads/2019/03/mergeSort.gif

 

package com.atguigu.sort;

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

//归并排序
public class MergeSort {

	public static void main(String[] args) {
		// 
		int[] arr = {8,4,5,7,1,3,6,2};//8->merge 7 // 80000 -> 80000-1
		int temp[] = new int[arr.length];//归并排序需要一个额外空间
		System.out.println("归并排序前:"+Arrays.toString(arr));
		mergeSort(arr, 0, arr.length-1, temp);
		System.out.println("归并排序后:"+Arrays.toString(arr));
		
		timeSort();
	}

	//分+合 方法
	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) {
//		System.out.println("xxx");
		int i = left;//初始化i,左边有序序列的初始索引
		int j = mid + 1;//初始化j,右边有序序列的初始索引
		int t = 0;// 指向temp数组的当前索引
		
		//(一) 先把左右两边(有序)的数据按照规则填充到temp数组
		//直到左右两边的有序数组,有一边被处理完毕(全部插入到了临时数组temp)
		while(i<=mid && j<=right) {
			//如果左边的有序序列的当前元素,小于右边有序序列的当前元素
			//则将左边的当前元素,添加到temp数组,然后 t++ ,i++
			if(arr[i]<=arr[j]) {
				temp[t] = arr[i];
				i++;
				t++;
			}else {//反之,将右边的当前元素,添加到temp数组,然后 t++ ,j++
				temp[t] = arr[j];
				j++;
				t++;
			}
		}
		//(二)
		//把剩余数据一边数据依次填充到temp
		while(i<=mid) {//左边的有序序列还有剩余
			temp[t] = arr[i];
			t++;
			i++;
		}
		while(j<=right) {//右边的有序序列还有剩余
			temp[t] = arr[j];
			t++;
			j++;
		}
		//(三)
		//将temp数组的元素拷贝到arr
		//注意:并不是每次都拷贝所有
		t = 0;
		int tempLeft = left;//
		//第一次合并tempLeft=0,right=1 // 第二次tL=2, right=3 //第三次 tL=0,right=3
		//最后一次合并 templeft =0,right =7;
//		System.out.println("tempLeft:"+tempLeft+"right:"+right);
		while(tempLeft <= right) {
			arr[tempLeft] = temp[t];
			t += 1;
			tempLeft += 1;
		}
	}

	// 耗时测试
	public static void timeSort() {
		// 测试排序的速度(O(n^2)),给80000个数据
		// 创建一个80000个随机数的数组
		int[] arr = new int[8000000];
		int temp[] = new int[arr.length];//归并排序需要一个额外空间
		for (int i = 0; i < 8000000; i++) {
			arr[i] = (int) (Math.random() * 8000000);// 生成一个【0,8000000】数
		}

		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("800万个随机数据-排序前的时间是: " + date1Str);
		//获取排序前时间
	    long s = Clock.systemDefaultZone().millis();
		mergeSort(arr,0,arr.length-1,temp);
		//打印 八万个随机数据【希尔排序-交换法】 总耗时间
	    System.out.println("800万个随机数据【归并排序】耗时: " + (Clock.systemDefaultZone().millis() - s) + " ms");
		Date data2 = new Date();
		
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("800万个随机数据-排序后的时间是: " + date2Str);
		
	}
}

硅谷—韩顺平—数据结构算法(~) 视频链接 一.:设计模式面试题 & 课程介绍(1~4) 1.:原型设计模式的,几个经典面试题:    1)请使用 UML 类图,画出原型模式核心角色?     -1:重写 clone 方法,实现深拷贝。 阅读详情

相关推荐

SAP OBYC自动过账全解析:从BSX到WRX的会计科目配置指南

本文深入解析SAP OBYC自动过账功能,从BSX到WRX的会计科目配置全流程,涵盖评估分组代码、事务码和评估类等核心概念。通过实战案例展示如何实现库存变动到财务过账的自动化流转,提升企业财务数据的准确性和效率。

weixin_29239279的博客 385

硅谷 java数据结构算法 学习笔记()

这里写目录标题线性结构和 非线性结构稀疏数组SparseArray需求介绍实例代码实现代码执行结果队列介绍数组模拟队列思路代码实现问题数组模拟环形队列环形队列代码实现 线性结构和 非线性结构 稀疏数组SparseArray 需求 记录棋盘的位置 可用用二位数组将它保存 ,但是会发现记录很多没有意义的数据很多空间浪费 可以用稀疏数组进行优化 介绍 稀疏数组就是压缩缩多余的冗余数据 第一行的记录原表的行列数和 非0值的个数 实例 代码实现 package com.luyi.DataStructure

weixin_43691773的博客 6029

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控演化机制

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控演化机制。

Pangenes的博客 1300

硅谷数据结构-归并排序

归并排序的概念 归并排序是利用归并的思想实现的排序算法,该算法采用经典的分治(divide-and-conquer)策略。分治策略中的分,是指把问题分成一些小的问题,然后递归求解;治是把分这个阶段得到的各个答案“修补”在一起。 (需要构造一个temp数组,所以空间复杂度高) 代码实现 import java.util.Arrays; public class MergeSort { public static void main(String[] args) { .

Amigo_1997的博客 677

数据结构算法笔记(硅谷韩顺平)

本文为个人学习数据结构算法的笔记。记录内容可能不尽详细

fjasflmav的博客 1389

硅谷_数据结构算法】六、十大经典排序算法解析java/c++实现

文章目录1. 冒泡排序(Bubble Sort)2. 快速排序(Quick Sort) 1. 冒泡排序(Bubble Sort) 基本概念 冒泡排序通过重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 原理描述 通过对待排序序列从前向后,依次比较相邻元素的排序码,若发现逆序则交换,使排序码较大的元素逐渐从前部移向后部。 实现步骤(默认升序的情况) 比较相邻的元素,如果前一个比后一个大,就交换这两个数; 针对所有元素重复以上的步骤,最后一个除外,直到没有任何一对数字

weixin_42301220的博客 985

硅谷Java数据结构算法——069 归并排序

代码实现 package com.atguigu.sort; import java.util.Arrays; /** * @author WHT * @create 2021-06-23 8:27 */ public class MergeSort { public static void main(String[] args) { int[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; mergeSort(arr, 0, arr

qq_33790600的博客 259

6.7 排序 (归并排序)

归并排序归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略分治算法将问题分成一些小的问题然后递归求解,而治的阶段将分的阶段得到的个答案“修补”在一起,即分而治之 归并代码如下: //合并的方法 /* *@param arr 排序的原始数组 *@param left 左边有序序列的初始索引 *@param mid 中间索引 *@param right 右边有序序列的初始索引 *@param temp 作为中转的数组 * */ public static void merge(int[]

weixin_45706249的博客 243

c++ 设计模式_硅谷Java数据结构算法、设计模式教程双双发布

文末附两教程下载地址(含源码、课件、笔记) 图解Java数据结构算法java数据结构算法1) 算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2) 网上数据结构算法的教程不少,但存在两个问题: (1) 授课方式单一,大多是照着代码念一遍,数据结构算法本...

weixin_39618456的博客 268

算法学习参考视频课程

1、 数据结构算法基础(青岛大学-王卓)_哔哩哔哩_bilibili转自up主 @青岛大学-王卓 https://space.bilibili.com/40323036?spm_id_from=333.788.b_765f7570696e666f.2为方便学习和观看视频。 已经咨询过王卓老师,并同意转载 没有PPT 《数据结构C语言版第二版》 中国工信出版集团 人民邮电出版社出版 严蔚敏 编著老师说只要有数据结构的教材就可以,内容都是相似https://www.bilibili.com/video/BV

爱的叹息的专栏 1588

八大排序——JAVA,万字总结(堆排序除外)

博客主页(4条消息) 小吴_小吴有想法_CSDN博客-笔记,java,leetcode领域博主 欢迎关注点赞收藏和留言 天道酬勤,勤能补拙,和小吴一起加油吧 17岁大一新生,水平有限,恳请各位大佬指点,不胜感激! ????这里有一点路线小伙伴可以参考一下哈(4条消息) JAVA实现客户信息管理系统以及给大一寒假学生的建议_小吴-CSDN博客 参考书籍《算法4》,学习视频:黑马程序员Java数据结构算法黑马程序员Java数据结构java算法,全网资料最全数据结构+算法教程,154张java数据结

小吴 1410

Java基础语法30-排序算法

Java基础语法30-排序算法 文章目录Java基础语法30-排序算法本文大多数代码来自于硅谷教程资料,如有侵权请告知。一、整型数组-不考虑排序的稳定性1.折半插入排序2.冒泡排序3.桶排序4.堆排序5.直接插入排序6.归并排序7.基数排序8.快速排序9.直接选择排序10.直接选择排序改进11.希尔排序二、对象数组—考虑排序的稳定性0.DataWrap类1.折半插入排序2.冒泡排序3.桶排序4.堆排序5.直接插入排序6.归并排序7.基数排序8.快速排序9.直接选择排序10.直接选择排序改进11.希尔排序

A1066223647的博客 206

*Sort List

Sort a linked list inO(nlogn) time using constant space complexity. 1 /** 2 * 本代码由九章算法编辑提供。没有版权欢迎转发。 3 * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。 4 * - 现有的面试培训课程包括:九...

dianxiangong2403的博客 89

以下是根据你提供的内容整理的**考试科目分值学习时长统计表**,结合分值占比和时长分布,给出优先级建议供参考

- **试题一**:数据流图(DFD)设计,占15分 - **试题二**:数据库设计(ER图转关系模式),占15分 - **试题三**:UML建模(类图、顺序图),占15分 - **试题四**:算法实现(代码补全),占15分 - **试题六**:设计模式应用(类图填充),占15分

[Blog][Domain] programb.blog.csdn.net 502

归并排序(速度跟快排差不多)

百度百科: https://baike.baidu.com/item/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F/1639015?fr=aladdin 代码: package com.afmobi; import java.util.Arrays; public class MergetSort { public static void m...

that summer 508

java合并排序(归并排序

归并排序:直接上图: 即,它把一个数组不断地划分,直到数组长度为1,然后将相邻 两个有序子数组段合并为一个有序数组段。 一般有两种方式: (1)采用递归分解 (2)采用非递归方式分解 //递归划分 public class MergeSort { static int a[]={0,10,20,5,9,35,58,78,54,32,15,28,79,30,50};//...

legendaryhaha的博客 8761

硅谷Java数据结构算法笔记07 - 排序算法

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值, 若发现逆序则交换, 使值较大的元素逐渐从前移向后部, 就象水底下的气泡一样逐渐向上冒。优化。

知不足而奋进,望远山而前行 2万+

Java学习——数据结构——归并排序

学习硅谷韩顺平老师的Java数据结构笔记,详情请移步网站 介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 基本思想 合并相邻有序子序列 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将 [4,5,7,8]和[1,2,

qq_41853002的博客 224

排序算法详细介绍及代码实现

时间复杂度解读 一、插入排序 1.直接插入排序 2.希尔排序 二、选择排序 1.直接插入排序 2.堆排序 三、交换排序 1.冒泡排序 bubble sorting 冒泡排序的基本思想:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐由前移向后边,就像水底下的气泡一样往上冒。 因为在排序的过程中,各个元素不断接近自己的位置,如果下一次比较没有进行交换,那么说明序列有序,我们可以使用一个flag来判断元素是否进行交换,用来减少不必要的比较

erwang1123的博客 371

排序算法归并排序(JAVA)

public class MergeSort { /** * 归并排序 * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 * 时间复杂度为O(nlogn) * 稳定排序方式 * @param nums 待排序数组 * @return 输出有序数组 */ public s

heitdf 5万+

tuxiangjiansuo.rar_image search_图像 相似_图片相似_相似图片检索_相似度 图

此程序根据打开文件的相似度实现图像的检索,查找类似图片

上一篇: 尚硅谷数据结构与算法(Java)--16--快速排序
下一篇: 尚硅谷数据结构与算法(Java)--18--基数排序
shlr_
博客等级 码龄7年 51粉丝 50原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值