一、题目理解

题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。

数据结构第一章就讲了有序表合并,不过那时候是合并到新表,判断条件是while(i<len1||j<len2),然后把a1或者a2数组(只有一个,因为另一个必定已经完全插入进了c数组,这也是为什么while条件是“或”)后面的元素;如果数据结构老师足够负责的话就应该提到这种情况,或者讲讲;不过由此来看,BAT的面试题很多还是来自课本的。

二、算法实现

设定两个指针left和right,初始状态下分别指向两个排序数组的首元素,然后比较a[left]和a[right]大小,如果a[left]<=a[right],那么数组中元素位置不发生改变,然后left往前进一步。如果a[left]>a[right],则表明前半段元素中存在大于后半段的元素,那么我们将后半段这个小的元素移到前半段来。但是在移动之前,我们得为这个元素空留出地方。这就有了元素移动的操作。比如{1,3,5,7,2,4,6,8,10}这样子序列,我们发现后半段的2小于前半段的3,那么我们将2放入临时变量temp中,然后将{3,5,7}往后移动一个位置,然后将空出来的位置放入temp的值。这里总体的循环是while(left<right&&right<len)。

做这个题,我首先确实想到了插入排序,不过结合ACM,我想到插入排序需要移动元素,这样时间复杂度可能比较高,不能AC(ACM对我的影响太大了),我立马排除了这种想法,哎,只需要考虑空间复杂度的。

package a;public class Test1 {static int[] a = {1,3,5,7,9,0,2,4,6,8};public static void main(String[] args) {// TODO Auto-generated method stubsolve(a,4,9);for(int i:a) {System.out.print(i+" ");}System.out.println();}private static void solve(int[] a, int mid, int num) {// TODO Auto-generated method stubint i=0;int j=mid+1;/** 原来条件我加上了i<=mid,没加i<j,这样是完全错误的;因为我们移动元素了,所以前半段不能限制到mid;* 我认为i<j是应该想到的,只需要这一个就够了,如果我每天都还AC的话或许就会记得这个条件。*/for(i=0,j=mid+1;i<j&&j<=num;) {if(a[i]<=a[j]) {i++;}else {int tempVal = a[j];for(int k=j-1; k>=i; k--) {a[k+1] = a[k];}a[i] = tempVal;j++;/** 这个自加条件不能放到if else后面,这样的话如果if里面i++了,然后又i++了*/i++;}}}
}

转载于:https://www.cnblogs.com/hxsyl/p/4172125.html

百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序相关推荐

  1. 面试题:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序...

    题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序.要求空间复杂度为O(1).注:a ...

  2. 百度首页快照不更新,内页收录正常是什么原因

    百度首页快照不更新,内页收录正常是什么原因     百度首页快照不更新是站长非常头疼的问题,为什么不更新呢?     第一.网站标题.网站关键字.网站描述频繁修改,百度蜘蛛感觉你还没准备好,所以你的网 ...

  3. 几个主要搜索引擎(Google和百度、雅虎)的站内搜索代码

    几个主要搜索引擎(Google和百度.雅虎)的站内搜索代码,使用时只需要将代码里的"www.williamlong.info"替换成你的网址即可.<!--Google站内搜索 ...

  4. 题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

    题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现) 题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字 ...

  5. vs2015c语言内嵌汇编,C#中内嵌资源的读取

    起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...

  6. 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums

    2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...

  7. Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...

    我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...

  8. python sort函数返回值_lambda函数与箭头函数在集合内置函数应用中的对照学习

    Python语言中有一个定义轻量级规则的lambda函数,其语法格式为: Lambda 参数列表:返回值表达式 简单的例子如:定义func=lambda x,y:x+y,则调用func(10,20)的 ...

  9. PHP跳转到另一个画面,并且带着该行内的一个数值作为参数传递给下一个页面.能给例子吗...

    2019独角兽企业重金招聘Python工程师标准>>> 项目需求: 我想按表格内一行中的一个按钮onclick事件, 跳转到另一个画面,并且带着该行内的一个数值作为参数. 表格内的数 ...

最新文章

  1. 特斯拉发布Q1无人驾驶安全报告:事故增多 但还是比人类少
  2. 通信系统之信道(二)
  3. scanf函数具体解释与缓冲区
  4. 用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式...
  5. nginx php pathinfo,Nginx解决PATH_INFO新解决办法
  6. 【Xamarin开发 Android 系列 6】 Android 结构基础(上)
  7. oracle的成本核算,Oracle11gR2全表扫描成本计算(工作量模式-workload)
  8. C语言的源代码文件、目标文件和可执行文件
  9. Kaggle TMDB电影数据分析项目实战
  10. linux显卡驱动安装在哪个文件夹,linux 下安装Nvidia显卡驱动
  11. 统计学、机器学习、数据挖掘、深度学习的关系
  12. 基于微信公众平台的教师评教系统
  13. [英语语法]词法之动词
  14. NLP领域表达退化各向异性理解及对应策略总结
  15. Java验证辛钦大数定理
  16. 用计算机画画的优质课,小学信息技术优质课和画图工具教案.doc
  17. 学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)...
  18. 用户界面设计应该用那些软件?
  19. 关于Informatica的使用(转载)
  20. python:打乱文本中每一行的顺序,如train.txt

热门文章

  1. 计算机科学技术基础c,计算机科学技术基础.ppt
  2. win7 nginx php 环境,win7下docker环境搭建nginx+php-fpm+easyswoole+lavarel开发环境
  3. php上传png_PHP支持多种格式图片上传(支持jpg、png、gif)
  4. vba mysql 没有为命令对象设置命令_怎样解决“没有为命令对象设置命令”的错误? - .Net论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  5. linux模拟cpu过载,linux下模拟CPU占用100%小程序
  6. STM32F103DMA功能实现
  7. python 近期用到的基础知识汇总(四)
  8. np.array 的shape (2,)与(2,1)的分别是什么意思
  9. python与机器学习(四)——线性回归和逻辑斯蒂回归
  10. pytorch梯度的计算过程