0
点赞
收藏
分享

微信扫一扫

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

代码敲到深夜 2022-03-19 阅读 17

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

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;
	}
}

举报

相关推荐

0 条评论