两个有序数组进行整合,要求整合后数组保持有序
题设:有两个有序数组A1和A2,内存在A1的末尾有足够的空间容纳A2,请实现一个函数,把A2中的所有的数字插入到A1中,并且保持所有的数字是有序的。
1.解题思路:
1、计算两个数组有效值合并后有效长度。
2、设置三个指针,(p,q,k),一个指向A1已初始化末尾,A2以初始化末尾, A1 + len(A2)末尾
3、比较p和q所指向的元素的大小,并将较大值赋值给k指针所指向的内容。
4、考虑当某个数组指向首地址时,另一个数组仍然存在多个数没有进行比较的情况。
2.源码
#include <iostream>
using namespace std;
void test()
{
int A1[20] = {1,3,5,6,7,8,12,17,19,20};
int A2[5] = {-1,-3,5,6,19};
/*
E1. 获取A2的长度
E2. 定义三个指针(p,q,k),一个指向A1已初始化末尾,A2以初始化末尾, A1 + len(A2)末尾
*/
int *p = A1 + 9; // p 指向A1有效初始化的最后一个元素
int *q = A2 + 4; // q 指向A2有效初始化的最后一个元素
int *k = A1 + 14; // k 指向两个数组合并后,A1有效值的最后一个元素
// 当A1指针p 或A2指针q指向首地址时之前(包含首地址元素的比较),进行较最大元素赋值
while(p >= A1 && q >= A2){
if(*p >= *q){
*k-- = *p;
// 避免指针溢出
if(p != A1){
p--;
}else
{
break;
}
}else{
*k-- = *q;
// 避免指针溢出
if(q != A2){
q--;
}else
{
break;
}
}
}
// 剩余元素进行替换(考虑当某个数组指向首地址时,另一个数组仍然存在多个数没有进行比较的情况)
while(q >= A2){
*k-- = *q;
if(q != A2){
q--;
}else
{
break;
}
}
// 打印数组A1
for(auto i : A1){
cout << i << ' ';
}
cout << endl;
}
int main()
{
test();
return 0;
}