算法导论 归并排序

问题描述写在了代码中,注释可以帮助理解

import java.util.ArrayList;

/**
 * @author xusulong
 * merge sort
 * 分解:将n个元素分成各含/2个元素的子序列
 * 解决:用merge sort对两个子序列递归地排序
 * 合并:合并两个已排序的子序列以得到排序结果
 */
public class MergeSort {
	private final static int max = 1000000;
	/**
	 * 对子数组A[p...r]进行排序
	 * @param A
	 * @param p
	 * @param r
	 */
	public static void mergeSort(ArrayList<Integer> A, int p, int r) {
		//当p = r 时候数组中只有一个元素,不需要排序,而p不可能大于r
		if(p < r) {
			int q = (p + r)/2;
			mergeSort(A, p, q);
			mergeSort(A, q + 1, r);
			merge(A, p, q, r);
		}
	}
	/**
	 * 
	 * @param A 数组
	 * @param p 下标
	 * @param q 下标
	 * @param r 下标
	 * 假设子数组a[p...q]和a[q + 1...r]已经排序好 p <= q < r
	 */
	public static void merge(ArrayList<Integer> A, int p, int q, int r) {
		//length of the child array
		int n1 = q - p + 1;
		int n2 = r - q;
		//create arrays L[1...n1 + 1] and R[1...n2 + 1]
		ArrayList<Integer> L = new ArrayList<Integer>(n1 + 1);
		ArrayList<Integer> R = new ArrayList<Integer>(n2 + 1);
		for(int i = 0; i < n1; i ++) {
			L.add(A.get(p + i));
		}
		L.add(max);
		
		for(int i = 0; i < n2; i ++) {
			R.add(A.get(q + i + 1));
		}
		R.add(max);
		
		for (int i = 0, j = 0, k = p; k <= r; k ++) {
			if (L.get(i) <= R.get(j)) {
				A.set(k, L.get(i));
				i ++;
			} else {
				A.set(k, R.get(j));
				j ++;
			}
		}
	}
	
	public static void main(String[] args) {
		ArrayList<Integer> A = new ArrayList<Integer>();
		A.add(4);
		A.add(2);
		A.add(5);
		A.add(7);
		A.add(0);
		A.add(3);
		A.add(1);
		A.add(6);
		mergeSort(A, 0, A.size() - 1);
		System.out.println(A);
	}
}

 时间复杂度cnlog2n + cn 为 O(nlog2n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值