程序员面试金典: 9.11 排序与查找 11.1给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合入A并排序。

#include 
#include 

using namespace std;

/*
问题:给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B
      合入A并排序。
分析:排序分为:比较排序,插入排序,归并排序,快速排序,堆排序等。
      比较排序:通过元素之间两两比较进行排序,典型的有:冒泡排序,堆排序
	  插入排序:找到待排序的位置,将选择好的值插入该位置。典型的有:简单选择排序,从数组中选则最小的放在第一位,从剩余2~n位中选择次最小放在第二位等
	  由于两个数组都是排好序的,与其将两个数组依次从前向后比较,每次找到数组A中待插入位置,需要将A中带插入位置及其之后元素全部后移一位,倒不如将两个
	  数组都从最后面开始遍历,两两比较元素,找到最大的元素放在两个数组长度之和的位置,重复上述操作。

输入:
4(数组A中的元素个数) 3(数组B中的元素个数)
1 5 7 11(数组A中元素)
2 6 12(数组B中元素)
输出:
1 2 5 6 7 11 12(输出B合并入A后的排序结果)

*/

const int MAXSIZE = 10000;

void mergeSort(int* arrayA , int sizeA , int * arrayB , int sizeB)
{
	if(sizeA <= 0 || sizeB <= 0 || NULL == arrayA || NULL == arrayB)
	{
		return;
	}
	int i = sizeA - 1;
	int j = sizeB - 1;
	int pos = sizeA + sizeB - 1;
	while(i >= 0 && j >= 0)
	{
		//比较两个元素谁大,就移动谁,并记录移动的位置
		if(arrayA[i] > arrayB[j])
		{
			//将较大的移动
			arrayA[pos--] = arrayA[i];
			i--;
		}
		else
		{
			arrayA[pos--] = arrayB[j];
			j--;
		}
	}

	//说明数组A中元素全部移动完了,剩下数组B中较小的元素还没有移动,下面一次全部移动
	if(j >= 0)
	{
		while(j)
		{
			arrayA[pos--] = arrayB[j--];
		}
	}
}

void print(int* arrayA , int size)
{
	if(NULL == arrayA)
	{
		return;
	}
	for(int i = 0 ; i < size ; i++)
	{
		cout << arrayA[i] << " ";
	}
	cout << endl;
}

void process()
{
	int n , m;
	int arrayA[MAXSIZE];
	int arrayB[MAXSIZE];
	while(cin >> n >> m)
	{
		memset(arrayA , 0 , sizeof(arrayA));
		memset(arrayB , 0 , sizeof(arrayB));
		//接下来输入元素
		for(int i = 0 ; i < n ; i++)
		{
			cin >> arrayA[i];
		}
		for(int i = 0 ;i < m ; i++)
		{
			cin >> arrayB[i];
		}
		//接下来合并排序
		mergeSort(arrayA , n , arrayB , m);
		//然后接下来就是输出结果
		print(arrayA , n + m);
	}
}

int main(int argc , char* argv[])
{
	process();
	getchar();
	return 0;
}

你可能感兴趣的:(程序员面试金典)