归并排序特性+Java实现

特点:稳定,不需要交换相同的元素。

什么情况使用归并排序?

假设有一个已经按照职位排序的员工列表,现在要按照工资排序。若两个员工工资相等,此时采用归并排序(稳定),将会保留职位排列的顺序。即首先按照工资排序,工资同者按职位排序。

package 算法;

public class 归并 {
	public void sort(int[] a,int left,int right) {//递归调用,将数组不断二分至最小单元
		int mid=(left+right)/2;
		if(left<right) {
		sort(a,left,mid);//先迭代左半边
		sort(a,mid+1,right);//后迭代右半边
		merge(a,left,mid,right);//迭代完了,合并排好序的两个最小单元
		}
	}
	public void merge(int[] a,int left,int mid,int right) {//合并两个排好序的最小单元合并排序
		int k=left;//之前设置k=0,错误,因为直接在数组a上调整,传导来的参数为a上实际位置而不是
		           //真正分割数组
		int[] temp =new int[a.length];
		int p1=left;
		int p2=mid+1;
		while(p1<=mid&&p2<=right) {//不超过两个单元的最右边
			if(a[p1]<=a[p2]) {
				temp[k++]=a[p1++];
			}else {
				temp[k++]=a[p2++];
			}
		}
		while(p1<=mid) {//右边超即右边都放入了temp,此时把左边放入temp
			temp[k++]=a[p1++];
			
		}
		while(p2<=right) {
			temp[k++]=a[p2++];
			
		}
		for(int i=left;i<=right;i++)
			a[i]=temp[i];
			
	}
	public static void main(String[] args) {
		归并 a=new 归并();
		int [] arr= {9,6,8,4,7,3,1};
		a.sort(arr, 0, arr.length-1);
		for(int aa:arr)
			System.out.println(aa);
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值