归并排序之Java实现

news/2024/5/17 18:52:12 标签: 归并排序

归并排序思路:现先待排序数组划分成两个数组,然后再划分,直至划分后的子数组只有一个元素(一个元素的数组既是有序数组),然后再两两合并(按照顺序合并),最终形成一个完整的有序数组。

所以归并排序核心有两个:两个数组合并排序成一个有序数组;一个数组怎么拆分成N个子数组。

代码实现:

public static void merge(int [] arr) throws Exception{
		if(arr == null){
			throw new Exception("输入参数有误");
		}
		int first = 0;
		int last = arr.length-1;
		merge_1(arr,first,last);
	}
	
	//完成数组的拆分
	public static void merge_1(int [] arr,int first,int last){
		int begin = first;
		int mid = (first+last)/2;
		int end = last;
		if(begin < end ){
			merge_1(arr,begin,mid);
			merge_1(arr,mid+1,end);
			conbineSort(arr,begin,end,mid);
		}
	}
	
	//完成两个数组合并成一个有序数组
	public static void conbineSort(int [] arr,int first,int last,int mid){
		int [] p = new int[100];
		int i = first;
		int j = mid+1;
		int k = 0;
		while(i <= mid && j <= last){
			if(arr[i] > arr[j]){
				p[k++] = arr[j++];
			}else {
				p[k++] = arr[i++];
			}
		}
		while(i <= mid){
			p[k++] = arr[i++];
		}
		while(j <= last){
			p[k++] = arr[j++];
		}
		for(int m = 0 ; m <k ; m++){
			arr[first+m] = p[m];
		}
	}
测试:

public static void main(String[] args) throws Exception {
		int [] arr = {5,9,1,3,52,13,2,8,4};
		merge(arr);
		for(int i : arr){
			System.out.println(i);
		}
	}
参考资料:http://blog.csdn.net/morewindows/article/details/6678165


http://www.niftyadmin.cn/n/1716255.html

相关文章

ddr3配置 dsp6678_多核DSP芯片TMS320C6678的DDR3接口设计

多核DSP芯片TMS320C6678的DDR3接口设计刘德保;汪安民【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2013(000)009【摘要】Multi-core processors have high performance ,commonly usedinmorecomplexapplicationstoachievemorefunctions.Theprocessor,externalhigh-spee…

Java多线程基础(二)

Java多线程理解 一、常用方法 1、join&#xff08;&#xff09;方法&#xff0c;让一个线程等待另一个线程执行完之后再执行。例如&#xff1a;A线程执行体中执行B线程的join方法&#xff0c;那么需要等到B线程执行完毕之后再执行A线程。 示例&#xff1a; public class My…

echarts 关系图 参数_Echarts3 关系图-力导向布局图

// 基于准备好的dom&#xff0c;初始化ECharts实例var myChart echarts.init(document.getElementById(main), macarons);//指定图表的配置项和数据var option {tooltip : {show :true, //默认显示showContent:true, //是否显示提示框浮层trigger:item,//触发类型&#xff0c;…

java多线程基础(三)

synchronized关键字 涉及到共享资源的读写访问&#xff0c;在同步时&#xff0c;往往会使用synchronized关键字&#xff0c;synchronized对象监视器既可以是对象&#xff0c;也可以是类。 1 synchronized应用于非静态方法 ① synchronized关键字修饰方法&#xff0c;取的锁是对…

protobuf3 自定义option_十一.Protobuf3可选项

Protobuf3 可选项.proto文件中可以声明许多选项。选项不会改变声明的整体含义&#xff0c;但可能会影响在特定上下文中处理声明的方式。可用选项的完整列表在google/protobuf/descriptor.proto中定义有些选项是文件级选项&#xff0c;这意味着它们应该写在顶级范围内&#xff0…

数字图像处理课设图像的锐化_C语言数字图像处理---3.3图像锐化

本篇将介绍图像增强范畴中的图像锐化部分&#xff0c;以经典的LAPLACE锐化和Photoshop USM锐化为例&#xff0c;通过C语言编程实现&#xff0c;教会大家这两种锐化算法&#xff0c;增强大家对图像锐化的理解以及对图像增强范畴的认知。[定义与算法]图像锐化(image sharpening)属…

字节跳动客户开发_Egret Engine 5.3.8 发布:支持字节跳动小游戏、改善开发体验...

今天我们正式发布了Egret Engine 5.3.8版本&#xff0c;相比于5.3系列中的其它版本&#xff0c;我们这次发布相对比较低调&#xff0c;但内容很接地气&#xff1a;新增字节跳动小游戏的发布支持&#xff0c;修复Egret Engine在运行时2D渲染、3D渲染、龙骨、Egret Native发布环节…

jersey 过滤_如何在Java中使用Jersey安全注释绕过servlet过滤器中的路径

由于您正在执行身份验证和/或授权&#xff0c;我建议使用名称绑定过滤器而不是servlet过滤器&#xff0c;因此您可以轻松地将它们绑定到您需要的资源。为了将过滤器绑定到REST端点&#xff0c;JAX-RS提供了元注释NameBinding&#xff0c;可以按如下方式使用&#xff1a;NameBin…