Q9.1

#include <iostream>
using namespace std;

//最naive的方法 
void merge(int a[], int len1, int b[], int len2)
{
	int i = 0, j = 0, k = 0;
	int *tmp = new int[len1 + len2];
	while(i < len1 && j < len2)
	{
		tmp[k++] = a[i] < b[j] ? a[i++] : b[j++];	
	}
	while(i < len1)
		tmp[k++] = a[i++];
	while(j < len2)
		tmp[k++] = b[j++];
	for(i = 0; i < k; ++i)
		a[i] = tmp[i];
	
	delete[] tmp;	
}

//better way

void merge_inverse(int a[], int len1, int b[], int len2)
{
	int i = len1 - 1, j = len2 - 1, k = len1 + len2 - 1;
	
	while(i > -1 && j > -1)
	{
		a[k--] = a[i] > b[j] ? a[i--] : b[j--];
	}
	
	while(i > -1)
		a[k--] = a[i--];
	while(j > -1)
		a[k--] = b[j--];
}

//in-place mergesort
void swap(int &x, int &y)
{
	x = x ^ y;
	y = x ^ y;
	x = x ^ y;
}
void merge_inplace(int a[], int lower, int upper)
{
	int mid = (lower + upper - 1) >> 1;
	int i = lower;
	
	while(i <= mid)
	{
		if(a[mid + 1] < a[i])
		{
			swap(a[i], a[mid + 1]);
			
			for(int j = mid + 1; j < upper; ++j)
			{
				if(a[j] <= a[j + 1])
					break;
				swap(a[j], a[j + 1]);
			}
		}	
		i++;
	}
}

int main(void)
{
	int a[100] = {
		1, 5, 8, 9, 20, 24
	};
	int len1 = 6;
	int b[] = {
		3, 6, 7, 14, 16, 18
	};
	int len2 = sizeof(b) / sizeof(int);
	
	int c[] = {
		1, 5, 8, 9, 20, 24, 3, 6, 7, 14, 16, 18
	};
	
	//merge(a, len1, b, len2);
	//merge_inverse(a, len1, b, len2);
	merge_inplace(c, 0, 12);
	for(int i = 0; i < 12; ++i)
		cout << c[i] << " ";
/*
	for(int i = 0; i < len1 + len2; ++i)
	{
		cout << a[i] << " ";
	}*/
	cout << endl;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值