合并两有序数组 时间O(n) 无辅助空间
2015-10-27 17:45
260 查看
题目来自《计算机算法设计与分析》王晓东第四版
原题重述:
设子数组a[0:k-1]和a[k:n-1]已经排好序(0<=k<=n-1)。试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法。要求算法在最坏的情况下所用的计算时间为O(n),而且只用到O(1)的辅助空间。基本思路: 设A={a1, a2,...,ai,bi+1,bi+2,...,bn} 定义三个指针left(指向数组前部分) right(指向数组后部分)mid(left和right交换以后生成的新序列)。 序列将分成三部分,三个指针负责把三个序列中的最小值有序的放在数组的前部分,left指针从头至尾遍历一边。此过程中会有以下几种情况: 1.left最小:left<mid<right和left<right<mid,最理想的情况,此时mid和right指针位置不变,left指针自增向后遍历。 2.right最小:right<mid<left和right<left<mid,此时right值最小,right和left互换,将最小值right放在序列前部分。left和right指针同时自增,mid位置不变。 3.mid最小:mid<left<right和mid<right<left,此时mid最小,将mid和left互换,最小值mid放在序列前部分。mid和left指针同时自增,right位置不变。 4.其他情况不予考虑。 算法停止条件:left=right指针。 算法时间复杂度为O(n),无辅助空间。实例演示:有空再写实现代码:暂无本文章为个人原创,转载或引用请注明出处,谢谢。
相关文章推荐
- 使用 Libki 来管理公共用户访问计算机
- 微型计算机的始祖:Altair 8800
- 通过手机、电脑远程开关机,Windows和linux机手机,电脑相互控制
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析