算法与数据结构学习 08 归并排序

总体思想,将两个有序表合成一个有序表


方法一:迭代法

void merge_two(int in[], int out[], int low, int middle, int high){
	int i, j, k;
	for (i = low, j = middle + 1, k = low; i <= middle&&j <= high; k++){
		if (in[i] < in[j])
			out[k] = in[i++];
		else
			out[k] = in[j++];
	}
	while (i <= middle) out[k++] = in[i++];
	while (j <= high)	out[k++] = in[j++];
}
int* merge_all(int in[], int out[], int length){
	int dk = 1;
	int *p = in;
	int *q = out;
	int *tmp;
	int *rf;
	while(dk < length){				//步长不能超过length
		int s = dk;
		dk = s * 2;
		int i = 0;


		while (i + dk < length){
			merge_two(p, q, i, i + s - 1, i + dk - 1);
			i = i + dk;
		}
		if (i + s < length){		<span style="white-space:pre">	</span>//如果i+s>=length,无需处理,因为[i,s]是有序的
			merge_two(p, q, i, i + s - 1, length - 1);
		}
		else{
			while (i < length){
				*(q + i) = *(p + i);
				i++;
			}
		}
		rf = q;<span style="white-space:pre">				</span>//rf指向最新的排列数组

		
						//现在out[]存放的元素是部分有序的,我们把它作为目标数组,赋值给in[]
		tmp = p;			//或者	int* tmp=&in[0];
		p = q;
		q = tmp;		

		cout << "------------------------------------" << endl;
	}
	return rf;

}


方法二:递归法

void merge_two(int in[], int len,int low, int middle, int high){
	int * out = new int[len];
	int i, j, k;
	for (i = low, j = middle + 1, k = low; i <= middle&&j <= high; k++){
		if (in[i] < in[j])
			out[k] = in[i++];
		else
			out[k] = in[j++];
	}
	while (i <= middle) out[k++] = in[i++];
	while (j <= high)	out[k++] = in[j++];

	for (int s = low; s <= high; s++)
		in[s] = out[s];
	delete out;
}


void merge_digui(int in[],int len,int low, int high){
	int mid;
	if (low < high){
		mid = (low + high) / 2;
		merge_digui(in,len,low, mid);
		merge_digui(in,len,mid + 1, high);
		merge_two(in, len,low, mid, high);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值