2020-05-28数据结构与算法-归并排序

2020-05-28数据结构与算法-归并排序

在这里插入图片描述`package merge_sort;
// private static Comparable[] assist; //归并辅助数组
public class merge {
private static Comparable [] assist;
public static boolean less(Comparable u,Comparable v) { //判断u是否小于v
return u.compareTo(v)<0;
} //比较两个数的大小,若小于,则输出1,若大于则输出0

public static void exchange(Comparable [] a,int i,int j) {
	Comparable temp;
	temp=a[i];
	a[i]=a[j];
	a[j]=temp;

}
public static void sort(Comparable [] a) {   //对数组内的元素进行排序
	//定义一个lo索引和一个hi索引 初始化辅助数组
	 Comparable [] assist = new Comparable[a.length]; //
	int lo=0;    //最低位索引
	int hi=a.length-1;   //最高位索引
	//调用sort重载方法
	sort(a,lo,hi);		
}

private static void sort(Comparable [] a,int lo,int hi) { //对数组内的元素索引lo到索引hi进行排序
	if(lo>=hi) {
		return;
	}       //数据不合理直接返回
//分组  定义一个中间索引
	int mid=lo+(hi-lo)/2;      //  中间取值
	
//分组排序
	sort(a,lo,mid);        //左子组
	sort(a,mid+1,hi);     //右子组
//归并
	merge1(a, lo,mid, hi);
}	
private static void merge1(Comparable [] a,int lo,int mid,int hi) {
	//从索引lo到mid是一个子数组,从索引mid+1到hi是一个子数组,最后把两个数组合并为一个大数组
	//定义三个指针
  
	int p1=lo;
	int p2=mid+1;
	int i=lo;
	Comparable[] assist =new Comparable[a.length];
	//int[] assist = new int[a.length];
	//遍历,移动p1和p2指针,比较大小
	while(p1<=mid && p2<=hi) {
		if(less(a[p1],a[p2])) {
			assist[i++]=a[p1++];
		}else {
			assist[i++]=a[p2++];
		}
	}
	//判断P1是否移动完,没有走完,就把p1里面的值继续放在辅助数组中
	while(p1<=mid ) {
		assist[i++]=a[p1++];
	}
	
	//判断P2是否移动完,没有走完,就把p2里面的值继续放在辅助数组中
	while(p2<=hi) {
		assist[i++]=a[p2++];
	}
	
//把辅助数组中的元素拷贝到原数组中

for(int index=lo;index<=hi;index++) {
a[index]= assist[index];
}
}

}

`
测试代码块

package merge_sort;

import java.util.Arrays;

public class testMerge {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Comparable [] a= {1,4,5,6,8,9,3,2};
	       merge.sort(a);
	       System.out.println(Arrays.toString(a));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值