剑指offer刷题笔记5相关题目:合并2个有序数组为1个

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 剑指offer刷题笔记5相关题目:合并2个有序数组为1个,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

  • 题目:有两个排序的数组A1,A2,内存在A1的末尾有足够的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入A1中,并且所有的数字都是排序的。
  • 分析:和前面的例题一样,很多人首先想到的方法是在A1中从头到尾复制数字,但这样就会出现多次复制一个数字的情况。更好的办法时从尾到头比较A1和A2中的数字,并把较大的数字复制到A1中的合适位置。
  • 代码如下:
#include<iostream>
int main() {
	int test1[20] = { 1,3,5,11,14,19 };
	int test2[20] = { 2,3,6,7,8,10,17,20 };
	int numberoftest1 = (sizeof(test1) >> 2) - 1;//test1的长度
	int numberoftest2 = (sizeof(test2) >> 2) - 1;//test2的长度
	while (!test1[numberoftest1]) {//找到test1中的最后一个元素
		numberoftest1--;
	}
	while (!test2[numberoftest2]) {//找到test2中的最后一个元素
		numberoftest2--;
	}
	int newnumber = numberoftest1 + numberoftest2 + 1;//新的test1中的索引
	int newnumber_prepare(newnumber);//设置一个备用变量,用于后面输出
	while (newnumber >= 0) {//比较两个数组的最后一个元素,将大的先放入A1
		if (test1[numberoftest1] > test2[numberoftest2] && numberoftest1 >= 0) {//判断条件和原数组中是否还省有元素
			test1[newnumber] = test1[numberoftest1--];
		}
		else if (numberoftest2 >= 0) {
			test1[newnumber] = test2[numberoftest2--];
		}
		newnumber--;
	}
	for (int i = 0; i <= newnumber_prepare; i++) {//打印数组
		std::cout << test1[i] << " ";
	}
}

运行结果如下:
在这里插入图片描述

  • 总结:在面对数组结构时,可以考虑从后面向前移动元素,往往可以减少很多不必要的移动。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130588.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!