Merge Sorted Array 合并两个有序数组

1.原题目

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.

比如

int a[11] = {1,2,3,4,5};
int b[6] = {3,4,5,6,7,8};

要得到a[11] = {1,2,3,3,4,4,5,5,6,7,8}


2.归并排序的其中一步


第一感觉这个题目比较简单,就是归并排序中的其中一步:

需要一个tmp数组,初始化两个int 作为指示器,分别指向a数组的第一个元素和b数组的第一个元素。

然后比较a数组和b数组的当前元素,谁比较小谁就放入tmp数组。完了后移向下一个元素。这样操作直到a指示器大于a数组长度或者b指示器大于b数组长度。

然后看a数组和b数组,谁还剩下元素就把谁全部复制到tmp数组中。

tmp数组就是最终的有序数组。


void merge(int A[], int m, int B[], int n) {
	
	int aIndex, bIndex,tmpIndex;
	aIndex = bIndex = tmpIndex = 0;
	int* tmp = new int[m + n];

	while(aIndex < m && bIndex < n){
	if(A[aIndex] <= B[bIndex]){
	tmp[tmpIndex++] = A[aIndex++];
	}else{
	tmp[tmpIndex++] = B[bIndex++];
	}
	}
        //如果a数组还有剩下,就复制a的到tmp
	while(aIndex < m){
	tmp[tmpIndex++] = A[aIndex++];
	}
        //如果b数组还有剩下,就复制b的到tmp
	while(bIndex < n){
	tmp[tmpIndex++] = B[bIndex++];
	}
        //最后再把tmp复制到a数组
         for(int i = 0; i < m + n; ++i){
	A[i] = tmp[i];
	}
	delete tmp;
}

3.为什么需要一个额外的tmp数组?


脑子被归并排序给先入为主弄傻了。因为归并排序是对一个数组进行操作,往往需要一个额外的数组来存储。这道题目中,a数组空间比较大,可以直接用a

换个思路,

初始化两个int 作为指示器,分别指向a数组的最后一个元素和b数组的最后一个元素。

然后比较大小,较大的放入a数组的末端。这样不断往前走。直到a数组用完或者b数组用完。

如果a数组先用完,那么就把b数组剩下的所有元素复制到a的前半部分,如果b数组先用完,那么a数组已经是一个有序的数组。


void merge(int A[], int m, int B[], int n) {
	
	int larstAIndex = m - 1;
	int larstBIndex = n - 1;
	int currentIndex = m + n - 1;

	while(larstAIndex >= 0 && larstBIndex >= 0){
		if(A[larstAIndex] >= B[larstBIndex]){
			A[currentIndex--] = A[larstAIndex--];
		}else{
			A[currentIndex--] = B[larstBIndex--];
		}
	}
	while(larstBIndex >= 0){
		A[currentIndex--] = B[larstBIndex--];
	}

}


Merge Sorted Array 合并两个有序数组


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值