归并排序

思路: 将存有较多数据的数组,拆分成两个数组,分别排序后,将有序的两个数组合并。合并前递归拆分的过程,直至只有一个元素后,逐级合并。

实现:

           
package com.test;

/**
 * 归并排序
 * @author xurongsheng
 * @date 2017年4月14日 上午11:22:25
 *
 */
public class MergeSort {

private long[] target;//待排序数据
	
	public MergeSort(){
		
	}
	
	public MergeSort(int maxLength){
		target = new long[maxLength];
	}
	
	public void setTargetValue(int index,long value){
		target[index] = value;
	}
	
	public long getTargetValue(int index){
		return target[index];
	}
	
	public void display(){
		System.out.print("A=");
		for (int i = 0; i < target.length; i++) {
			System.out.print(target[i]+" ");
		}
		System.out.println(" ");
	}
	
	/**
	 * 归并排序
	 * 时间复杂度: O(nlogN)
	 * @author xurongsheng
	 * @date 2017年4月14日 下午3:32:10
	 */
	public void mergeSort(){
		long[] workSpace = new long[target.length];
		recMergeSort(workSpace,0,target.length-1);
	}
	
	/**
	 * 归并
	 * @author xurongsheng
	 * @date 2017年4月14日 上午11:33:29
	 * @param workSpace
	 * @param lowerBound
	 * @param upperBound
	 */
	private void recMergeSort(long[] workSpace,int lowerBound,int upperBound){
		if(lowerBound == upperBound){ //只有一个元素,无需排序
			return;
		}else{
			int mid = (lowerBound+upperBound)/2; //中间项
			recMergeSort(workSpace,lowerBound,mid); //排序左侧项
			recMergeSort(workSpace,mid+1,upperBound); //排序右侧项
			merge(workSpace,lowerBound,mid+1,upperBound);
		}
	}
	
	/**
	 * 合并两个有序数组
	 * @author xurongsheng
	 * @date 2017年4月14日 下午2:12:16
	 * @param workSpace
	 * @param lowPtr
	 * @param highPtr
	 * @param upperBound
	 */
	private void merge(long[] workSpace,int lowPtr,int highPtr,int upperBound){
		int j = 0; //
		int lowerBound = lowPtr;
		int mid = highPtr - 1;
		int n = upperBound - lowerBound + 1;
		
		while(lowPtr <= mid && highPtr <= upperBound){
			if(target[lowPtr] < target[highPtr]){
				workSpace[j++] = target[lowPtr++];
			}else{
				workSpace[j++] = target[highPtr++];
			}
		}
		
		while(lowPtr <= mid){
			workSpace[j++] = target[lowPtr++];
		}
		
		while(highPtr <= upperBound){
			workSpace[j++] = target[highPtr++];
		}
		
		for(j = 0; j
效率: 归并排序的时间复杂度为 O(n*logN)   最好、最坏、平均情况下都是O(n*logN)    logN为以2为底N的对数
             由于计算过程中需要一个长度为n的临时空间,故 空间复杂度为O(N)
          


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值