算法导论笔记——归并排序

归并排序采用了分治策略:即将原问题划分成n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后再合并结果,就得到原问题的解。

归并排序算法步骤:

  • 分解:将n个元素分成个含n/2个元素的子序列
  • 解决:用归并排序算法对两个子序列递归的排序
  • 归并:将两个子序列的结果归并的到最终结果。
伪代码:



下面一个具体的执行过程:


当子问题执行完之后,合并子结果得到总结果。

Java代码:

public static void merge(int[] a, int p, int q, int r) {
		int num1 = q - p + 1;
		int num2 = r - q;
		int[] a1 = new int[num1];
		int[] a2 = new int[num2];
		for(int i = 0; i < num1; i++) {
			a1[i] = a[p+i];
		}
		for(int i = 0; i < num2; i++) {
			a2[i] = a[q+i+1];
		}
		int i = 0, j = 0, k = p;

		while(i < num1 && j < num2)
		{
			if(a1[i] <= a2[j]) {
				a[k++] = a1[i++];
			}
			else {
				a[k++] = a2[j++];
			}
		}
		while(i < num1) {
			a[k++] = a1[i++];
		}
		while(j < num2) {
			a[k++] = a2[j++];
		}
	}
	
	public static void mergeSort(int[] a, int p, int r) {
		if(p < r) {
			int q = (p+r) / 2;
			mergeSort(a, p, q);
			mergeSort(a, q+1, r);
			merge(a, p, q, r);
		}
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值