两段有序数组原地归并
来源:互联网 发布:男人花网络女主播是谁 编辑:程序博客网 时间:2024/05/14 12:47
假设数组是1,3,5,14,15,20,21,22,6,8,10,11,12,16,18,19
请用O(1)的时间将数组归并成有序数组。
这个题目最基础的想法就是把后面的数据每次一个的插入到前面已经有序的数组中。优化点在于在前面查找插入位置的时候可以用二分查找。
那么这个方法最快也是O(nlogn)的。有没有更快的算法呢?
看下面的思路:
既然从后半数组中找一个数插入到前面去,这种方法比较慢,那么能不能一段一段的插到前面呢?
从前一般的数组中找到第一个比后一半的第一个数字b大的数,记为a,
再从后一半中b之后的数组中找到第一个大于a的数字,记为c,
然后,把从a开始到c的这些元素,以b为分割点,循环右移【循环右移的方法是先把前一半反转,再把后一段反转,再把整体反转】
循环右移之后,从b到c,再到a这些数字就是有序的了。然后再后面其他的剩余数组中再次使用前面的方法,就可以一段一段的把数组元素插入到前面了。
比如,1,3,5【14】,15,20,21,22,6,8,10,11,12,【16】,18,19,
14和16分别是上面方法中要找到的数字,然后把从14到16之前,这一段的数字“循环移位”
可以得到:6,8,10,11,12,15,20,21,22,
合并到原来的数组里就是:
比如,1,3,5,6,8,10,11,12,15___20,21,22,16,18,19
由上面的数据可以看出,15之前的数据已经是有序的了。然后就是用同样的方法合并20,21,22,16,18,19这几个数字了。
有空再实现代码。现在时间不多...
- 两段有序数组原地归并
- 原地合并两个有序数组
- 在一个两段有序的数组中查找
- 两个有序数组(有序段sorted run)简单归并算法的比较次数的分析
- 有序数组归并和有序单链表归并
- 有序数组归并
- 有序数组归并
- 有序数组归并
- 有序数组归并
- 归并两个有序数组
- 原地归并数组 Merge Sorted Array
- 原地归并
- 原地归并
- 两个有序数组归并为一个数组
- 将两个有序数组归并为一个有序数组
- 将两个有序数组归并成一个有序数组
- 两有序数组的交集
- 两组有序数组合并
- 【数论】MMT数解题报告
- 子函数中设置校验方式mark,space
- ORACLE异常记录
- 深入java虚拟机笔记
- 【字符串】漏洞和补丁解题报告
- 两段有序数组原地归并
- 一个人与一句话
- 异步通知《来自Linux驱动程序开发实例》
- STL之迭代器事例三
- 五层木桶理论/五层木桶理论
- Lisp.字符串和字符
- linux下练习 c++ 容器的vector的特性
- session和cookie有什么区别
- 折腾MFC无爱~看看OpenCV自带的鼠标、键盘消息处理机制。