两段有序数组原地归并

来源:互联网 发布:男人花网络女主播是谁 编辑:程序博客网 时间: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这几个数字了。

有空再实现代码。现在时间不多...

 

原创粉丝点击