归并排序

public class MergeSortTest {
	private long[] array;
	private int length;
	
	public MergeSortTest(long[] array) {
		this.array = array;
		this.length = array.length;
	}
	public static void main(String[] args) {
		long[] array = new long[]{64, 54, 34, 56, 85, 43, 32, 13, 43, 65, 67};
		MergeSortTest arr = new MergeSortTest(array);
		
		arr.display();
		arr.mergeSort();
		arr.display();
	}
	
	/**
	 * 先定义一个工作空间,用于存放将要进行归并排序的数据
	 * 递归对工作空间数组进行归并排序
	 * 		初始状态时:上限为0,下限为length-1
	 */
	private void mergeSort() {
		long[] workspace = new long[length];
		recMergeSort(workspace, 0, length - 1);
	}
	
	/**
	 * 递归对工作空间的数组进行排序
	 * 
	 * @param workspace		工作空间
	 * @param lowerBound	下限
	 * @param upperBound	上限
	 */
	private void recMergeSort(long[] workspace, int lowerBound, int upperBound) {
		// 如果上限等于下限,则立刻返回
		if(lowerBound == upperBound) return;
		// 取得工作空间中间位置的索引
		int mid = (lowerBound + upperBound)/2;
		// 递归排序工作空间中从下限到中间位置所有数据元素
		recMergeSort(workspace, lowerBound, mid);
		// 递归排序工作空间中从中间位置下一个位置到上限的所有元素
		recMergeSort(workspace, mid + 1, upperBound);
		// 将工作空间中已经排序好的数据进行归并
		merge(workspace, lowerBound, mid + 1, upperBound);
	}
	
	private void merge(long[] workspace, int low, int high, int up) {
		// 工作空间的索引指针
		int j = 0;
		// 原始数组中相对于工作空间的基值
		int base = low;
		// 中间位置
		int mid = high - 1;
		// 工作空间中数据元素的个数
		int n = up - low + 1;
		// 可以将工作空间数组看成是有low-mid, high-up两段空间组成的数组
		// 合并两段数组
		while(low <= mid) {
			if(high <= up)workspace[j++] = array[low] < array[high] ? array[low++] : array[high++];
			else workspace[j++] = array[low++];
		}
		while(high <= up) workspace[j++] = array[high++];
		// 最后,将工作空间中有序的数据元素放回原始数组中
		for(j = 0; j < n; j++) {
			array[base + j] = workspace[j];
		}
	}
	
	private void display() {
		for(int i = 0; i < length; i++) {
			System.out.print(array[i] + "  ");
		}
		System.out.println();
	}

	public void insert(long elem) {
		array[length++] = elem;
	}
	
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值