归并排序.

概述

接下说说归并排序,和快排一样是分治的思想,个人觉得代码核心的merge合并算法实现起来要比快排的partition稍微简单点。

这里比较一下归并和快排的不同点:

1、两种排序都是自顶向下,但是归并排序是递归到底才开始排序(从最小规模开始),逐步合并为整个有序数组。

2、快排是不稳定排序,归并是稳定但是需要额外的辅助空间aux[n],理论上稳定并且不需要辅助空间的排序只有堆排序。

代码

这里的merge是将a[]归并到aux[],再拷贝回a[]中去。另外也可以先拷贝到aux[],再归并回a[]。

void merge(int a[], int lo, int mid, int hi, int* aux){
	int i = lo;
	int j = mid + 1;
	int k = lo;
	//[(lo\i).....sorted array.....mid|j.....sorted array.....hi]  ==>  [k..............]
	while(k <= hi){
		//控制流中最好不要把前连个分支当成后两个分支的前置条件,后两个分支显示声明出来比较好
		if (i > mid) { aux[k++] = a[j++]; }
		else if (j > hi) { aux[k++] = a[i++]; }
		else if (a[i] < a[j]) { aux[k++] = a[i++]; }
		else if (a[i] >= a[j]) { aux[k++] = a[j++]; }
	}
	for(int i = lo; i <= hi; i++){
		a[i] = aux[i];
	}
}
void sort(int a[], int lo, int hi, int* aux){
	if (lo >= hi)
		return;
	int mid = (lo + hi) / 2;
	sort(a, lo, mid, aux);
	sort(a, mid + 1, hi, aux);
	merge(a, lo, mid, hi, aux);
}
void MergeSort(int a[], int n) {
	int *aux = new int[n];
	memset(aux, 0, n);
	sort(a, 0, n - 1, aux);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值