排序算法之归并排序

 

       归并排序:采用分治策略的一种排序算法,先把要排序的数组分成两个有序的序列,然后再比较两个有序序列的最小值进行排序。排序的时间复杂度是O(nlgn)。

下面是用java实现的代码

 

 

/**
 * 归并排序
 *
 */
public class MergeSort {
	
	//两个有序数组的归并
	public void merge(Integer begin,Integer end,Integer n,Integer[] data){
		int b1=begin;
		int b2=n+1;
		//把后一个数组归并到前一个数组里,没有新建数组,只是在原来的数组上进行移动
		while(b2<=end){
			//比较两个数组中最小的两个数就行,如果第一个数组的数小,则不用移动,否则进行移动
			if(data[b1]>data[b2]){
				//把b2放在b1的前面
				int temp=data[b2];
				int b2l=b2;
				while(b2l>b1){
					data[b2l]=data[b2l-1];
					b2l--;
				}
				data[b1]=temp;
				//移动之后,第二个数组的下标加1
				b2++;
				//移动之后,第一个数组占据了第二个数组的一个位置,所以n要+1
				n++;
			}else{
				//第一个数组的值小,则第一个数组的下标加1
				b1++;
				if(b1>n){
					return;
				}
			}
		}
	}
	
	public void mergeSort(int begin,int end,Integer[] data){
		int n=(begin+end)/2;
		if(begin<end){
			mergeSort(begin,n, data);
			mergeSort(n+1,end, data);
			merge(begin,end,n,data);
		}
	}
	
	/**
	 * 排序分为三部分
	 * 1、1到(n+1)/2之前的排序
	 * 2、(n+1)/2和n之前的排序
	 * 3、两个有序之间的合并
	 * @param data
	 */
	public void sort(Integer[] data){
		int n=(data.length)/2;
		int begin=0;
		int end=data.length-1;
		if(begin<end){
			mergeSort(begin,n, data);
			mergeSort(n+1,end, data);
			merge(begin,end,n,data);
		}
		
	}
	

	public static void main(String[] args) {
		Integer[] data=new Integer[]{2,6,9,90,99,3,88,100,120,1,7,130};
		MergeSort sort=new MergeSort();
		//sort.merge(0,data.length-1,data.length/2, data);;
		sort.sort(data);
		for(int i=0;i<data.length;i++){
			System.out.print(data[i]+"  ");
		}
	}
}


运行之后输出为:

 

 

1  2  3  6  7  9  88  90  99  100  120  130  

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值