您的位置:首页 > 职场人生

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

2017-01-11 22:05 477 查看
#include <iostream>
#include <stdio.h>

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐