高级排序->merge(归并)排序

本文详细探讨了高级排序算法中的归并排序,从基本原理到实现步骤,全面阐述了其工作过程。归并排序是一种稳定的分治算法,通过递归将数组分成小段,再进行合并,达到排序的目的。其优点在于无论数据初始状态如何,都能保证O(n log n)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package day02;

public class merge {

	//归并所需要的辅助数组
	private static Comparable[] assist;
	
	/*
	 * 对数组a中的元素进行排序
	 */
	public static void sort(Comparable[] a){
		//1.初始化辅助数组assist
		assist=new Comparable[a.length];
		//2.定义一个 lo变量和一个hi变量,记录数组中最小的索引和最大的索引
		int lo=0;
		int hi=a.length-1;
		//3.调用sort重载方法,完成数组a中从lo到hi的元素排序
		sort(a,lo,hi);
	}
	/*
	 * 对数组a中从lo到hi的元素进行排序
	 */
	private static void sort(Comparable[] a,int lo,int hi){
		//做一个安全性校验
		if(hi<=lo){
			return;
		}
		//1.对lo到hi之间的数据分为两个组
		int mid=lo+(hi-lo)/2;
		//2.分别对每个组的数据进行排序
		sort(a,lo,mid);
		sort(a,mid+1,hi);
		
		//3.在把两个组中的数据进行合并
		merge(a,lo,mid,hi);
	}
	
	/*
	 * 对数组a从lo到mid为一组,,从mid+1到hi为一组,对这两组数据进行归并
	 */
	private static void merge(Comparable[] a,int lo,int mid,int hi){
		//1.定义三个指针
		int i=lo;
		int p1=lo;
		int p2=mid+1;
		//2.遍历,移动p1指针和p2指针,比较对应索引处的值,找出小的那个,放到辅助数组的对应索引处
		while(p1<=mid&&p2<=hi){
			//比较对应索引处的值
			if(less(a[p1],a[p2])){
				assist[i++]=a[p1++];
			}
			else{
				assist[i++]=a[p2++];
			}
		}
		//3.遍历,如果p1指针没有走完,那么顺序移动p1指针,把对应的元素放到辅助数组的对应索引处
		while(p1<=mid){
			assist[i++]=a[p1++];
		}
		//4.遍历,如果p2指针没有走完,那么顺序移动p2指针,把对应的元素放到辅助数组的对应索引处
		while(p2<=hi){
			assist[i++]=a[p2++];
		}
		//5.把辅助数组中的元素拷贝到原数组中
		for(int index=lo;index<=hi;index++){
			a[index]=assist[index];
		}
	}
	
	/*
	   * 比较v元素是否小于w元素
	   */
	private static boolean less(Comparable v,Comparable w){
		return v.compareTo(w)<0;
	}
	/*
	   * 数组元素i和j交换位置
	   */
	private static void exch(Comparable[] a,int i,int j){
		Comparable temp;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值