标签:
题目:
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