数组合并的面试题

Q:数组a[0,mid-1] 和 a[mid,num-1],都分别有序。将其merge成有序数组a[0,num-1],要求空间复杂度O(1)。

数组al一共有num个元素。前mid个元素和后num-mid个元素均是有序,要求对整个数组排序。

A: 这题我用到了两个算法

      1  O(N)复杂的的顺序选择算法,即O(N)时间内找出无序数组中第k小的数。

      2  字符串翻转算法 即abc|de -> de|abc,这个算法时间复杂度也是O(N)。


这道题mid并不一定要是中间位置。

首先,找出数组a的中位数K,此时数组a[0,mid-1]有i个元素>=K, a[mid,num-1]有j个元素<=K,如下图,我们把这i个元素和j个元素分别看做两个部分,交换这两部分数字,即从1 5 6 7 | 2 3 8 => 1 2 3 | 5 6 7 8。

此时可以确定前面一般的元素都是有序的。但是后面一半元素还没有排好序。

没错,这时候自然是用递归的方法做下去了。那么时间复杂度是多少呢?我们写出算法递归方程。

T(N) = T(N/2) + O(N)

根据主定理可以证明复杂度为O(N)。  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值