合并两个排序的数组

#include<iostream>
using namespace std;

/*有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.
实现一个函数,把A2中的所有数字插入到A!中并且所有的数字是排序的。*/


/*思路:先计算出两个数组中元素的总个数,然后从尾到头比较array1和array2中的数字,
        并把较大的数字复制到array1的合适位置。*/

//num1和num2分别表示array1和array2中数字的个数,  length表示array1的长度。
void Merge(int array1[], int array2[], int length, int num1, int num2)
{
	int num = num1 + num2;
	if(num > length)
		return;

	if(array1 == NULL || array2 == NULL || length < 0)
		return;

	int i = num1 - 1;
	int j = num2 - 1;
	int k = num - 1;
    while(i >= 0 && j >= 0)
	{
		if(array1[i] > array2[j])
			{
				array1[k--] = array1[i--];
		    }
		else
			array1[k--] = array2[j--];

	}
	if(i >= 0)
	{
		while(i >= 0)
			array1[k--] = array1[i--];
    }
		
	if(j >= 0)
	{
		while(j >= 0)
			array1[k--] = array2[j--];
	}
}

/*判断两个数组是否相等*/
bool isSame(int a[], int b[], int sum1, int sum2)
{
	if(sum1 != sum2)
		return false;
	if(a == NULL || b == NULL)
		return false;
	for(int k = 0; k < sum1; k++)
		if(a[k] != b[k])
			return false;
	return true;

}
/*测试代码*/
void Test(char* testName, int array1[], int array2[], int length, int num1, int num2, int expect[], int k)
{
	if(testName != NULL)
		cout << testName << "begins"<< endl;
	Merge(array1, array2, length, num1, num2);

	/*打印出array1中的元素*/
	cout << "array1:";
	for(int i = 0; i < num1 + num2; i++)
		cout <<array1[i] << " ";

	cout << endl;

	/*打印出expect中的元素*/
	cout << "expect:";
	for(int j = 0; j < k; j++)
		cout  << expect[j] << " ";

	cout << endl;

	if(isSame(array1, expect, num1 + num2, k))
		cout << "passed." << endl;
	else 
		cout << "failed." << endl; 
}

/*一个是奇数数组,一个是偶数数组*/
void Test1()
{
	int array1[20] = {1,3,5};
	int array2[] = {2,4,6};
	int expect[] = {1,2,3,4,5,6};
	Test("Test1", array1, array2, 20, 3,3,expect, 6);
}
/*一个数组中的数比另一个数组中的数小,一个数组中的数比另一个数组中的数大*/
void Test2()
{
	int array1[20] = {1,2,3};
	int array2[] = {4,5,6};
	int expect[] = {1,2,3,4,5,6};
	Test("Test2", array1, array2, 20, 3,3,expect, 6);
}
/*其中第一个数组是空数组,*/
void Test3()
{
	int array1[20] = {0};
	int array2[] = {1,2,3};
	int expect[] = {1,2,3};
	Test("Test3", array1, array2, 20, 0,3,expect, 3);
}
/*其中第二个数组是空数组,*/
void Test4()
{
	int array1[20] = {1,2,3};
	int array2[] = {0};
	int expect[] = {1,2,3};
	Test("Test4", array1, array2, 20, 3,0,expect, 3);
}
/*其中两个数组是空数组,*/
void Test5()
{
	int array1[20] = {0};
	int array2[] = {0};//
	int expect[] = {0};
	Test("Test5", array1, array2, 20, 0,0,expect, 0);
}

int main()
{
	Test1();
	Test2();
	Test3();
	Test4();
	Test5();

	return 0;
}

输出结果为:

合并两个排序的数组_第1张图片

你可能感兴趣的:(合并两个排序的数组)