标签:
题目:
Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.
题意要把两个有序的数组合并到他们中的一个数组中。
题目分析:数组合并不像链表合并,如果从头往后合并,要么移动数据,要么重新开辟一段内存(重新定义一个m+n大小的数组),A数组后面n个元素本身就是空的,我们可以从后往前合并,不用移位。
方法一:
从后往前合并。代码如下:
void merge_back(int A[], int m, int B[], int n) {
int i=m-1;
int j=n-1;
int t=m+n-1;
while (i>=0&&j>=0)
{
if (A[i]>=B[j])
{
A[t]=A[i];
i--;
}
else
{
A[t]=B[j];
j--;
}
t--;
}
while(j>=0)
{
A[t]=B[j];
j--;
t--;
}
}方法二
利用插入排序算法,即假设对比的数据是A的最后一个数据和B的第一个数据。如果A的最后一个数据比B的第一个数据小,直接插,如果A的最后一个数据比B的第一个数据大,利用插入排序算法,找A数组中合适B的第一个元素的位置。
代码如下:
void insert_merge(int A[], int m, int B[], int n)
{
int i=m-1;
int j=0;
int t=m;
for (t=m;t<m+n;t++)
{
if (A[i]<=B[j])
{
A[t]=B[j];
j++;
i++;
}
else
{
int k=i;
int x=B[j];
A[t]=A[i];
while(x<A[k])
{
A[k+1]=A[k];
k--;
}
A[k+1]=x;
i++;
j++;
}
}
}
<pre name="code" class="cpp">#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
void merge_back(int A[], int m, int B[], int n) ;
void insert_merge(int A[], int m, int B[], int n) ;
void main()
{
int A[5+6]={1,4,8,9,10};
int B[6]={2,5,6,9,10,11};
insert_merge(A, 5, B, 6);
//merge_back(A, 5, B, 6);
for (int i=0;i<11;i++)
{
cout<<A[i]<<" ";
}
}
void merge_back(int A[], int m, int B[], int n) {
int i=m-1;
int j=n-1;
int t=m+n-1;
while (i>=0&&j>=0)
{
if (A[i]>=B[j])
{
A[t]=A[i];
i--;
}
else
{
A[t]=B[j];
j--;
}
t--;
}
while(j>=0)
{
A[t]=B[j];
j--;
t--;
}
}
void insert_merge(int A[], int m, int B[], int n)
{
int i=m-1;
int j=0;
int t=m;
for (t=m;t<m+n;t++)
{
if (A[i]<=B[j])
{
A[t]=B[j];
j++;
i++;
}
else
{
int k=i;
int x=B[j];
A[t]=A[i];
while(x<A[k])
{
A[k+1]=A[k];
k--;
}
A[k+1]=x;
i++;
j++;
}
}
}运行结果为:1 2 4 5 6 8 9 9 10 10 11
标签:
原文地址:http://blog.csdn.net/sinat_24520925/article/details/45196925