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

一、题目理解

题目:数组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 stub
		solve(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 stub
		int 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++;
			}
		}
	}
}
时间: 2024-08-11 01:35:49

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

Android学习之——如何将GridView内嵌在ScrollView中

最近在做一个项目,有一个需求是在ScrollView中内嵌一个GridView. 刚开始,我是以为能直接内嵌在里面: 1 <ScrollView 2 android:layout_width="match_parent" 3 android:layout_height="0dp" 4 android:layout_weight="5.5"> 5 <GridView 6 android:id="@+id/gridView

iframe子页面内刷新父页面中另一个iframe子页面

框架页面如下: <div id="aa" style="float: left; height: 500px; border-right-style: solid; border-right-color: #CCCCFF; border-right-width: 2px;"> <IFRAME id="tree" name="tree" src="/ScienProjectWeb/commonjsp/

10.16输入一个字符串,内有数字和非数字字符,如: a123x456 17960? 302tab5876 将其中连续的数字作为一个整数,依次存放到一数组num中。例如123放在num[0]中,456放在num[1]中……统计共有多少个整数,并输出这些数。

10.16输入一个字符串,内有数字和非数字字符,如: a123x456 17960? 302tab5876 将其中连续的数字作为一个整数,依次存放到一数组num中.例如123放在num[0]中,456放在num[1]中--统计共有多少个整数,并输出这些数. #include <stdio.h> int main(){ void search(char * parr, int * pnum); char arr[100],* parr; int num[30],* pnum; parr=arr;

《窗内窗外—一个程序员的成长史》系列来了!!!

(大家好,从今天起,我的微信公众号(zhouzxi)会连续推送<窗内窗外-一个程序员的成长史>系列.本系列以我本人从学校到职场的经历为原型,同时结合了我对软件开发工作.程序员的学习和生活的认识和感悟,欢迎大家阅读.你的点赞和支持是我写作的动力.下面是本系列的第一篇文章,让我们跟随主人公代是雄的脚步一起去体验程序员生活吧!) 翻开日历,已是2012年的4月.代是雄,中国一个普通高校的的硕士研究生,就要毕业了. 回首自己的在校的学习生涯,代是雄感慨万千.从5岁第一天踏进学校的大门开始,到如今25岁

数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建数组 //1.快速创建数组@[] NSArray*[email protected][@"month",@"tue",@" wed",@"fir"]; //2,创建空的数组 NSArray*arr=[[NSArray a

如何在一周内摸清一个行业?

一周之内真的能摸清一个行业? 在和咨询.投行.投资.猎头这些行业的人聊天的时候,我反复听到“一周”这个时间,于是我也开始好奇:你们是在什么情况下需要在一个星期之内了解一个行业?你们都是如何做到在一个星期之内摸清一个行业的? 在一周之内“摸清”一个行业依然不可能成为这个行业的顶尖专家,也不可能成为这个行业的一个高管.但是,你能了解一个行业的全局,现今状况.过去.未来一段时间内可能的发展趋势,熟悉那个行业的行话,拿捏这个行业的基本信息. 这有什么用? 你能和那个行业内的人自如对话,你能站在局外人的角

【视频】半小时内编写一个贪吃蛇游戏

贪吃蛇编写提纲 致谢: 感谢 Ronnie Mooney ,我是在学习了他的视频后完成这个视频的,你可以在 [C#] Creating a Snake Game - Less than an Hour 找到他的视频(需翻墙,请自备梯子). 编写 Input 静态类 初始化静态变量 private static readonly Hashtable _keys = new Hashtable() 编写方法 public static void ChangeState(Keys key, bool

偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2013/01/30/394920.html 其中下面有人评论为: 有序列表查找显然二分啊,博主貌似对java的arrays和collections不是很熟. private static int getMinAbsoluteValue(final int[] source) { int index

面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

package siweifasan_6_5; /** * @Description:在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. * @Parameters: // Parameters: // numbers: an array of integers //