优化排序

http://www.cnblogs.com/jack204/archive/2012/10/10/2717795.html

已知一个n个元素的数组,第i个元素在排序后的位置在[i-k,i+k]区间,k<<n .让你设计一个算法对数组排序,要求时间复杂度最小


方法1:

建一个k的小堆,每次取最小,插入下一个,维护这个堆n次,总共为O(nlogk)。
归纳法证明:

1 前k个取出最小的必然就是全部数组的最小的,因为第一个位置的在[0, k-1]之中的一个。
2 第j个取出来的数字,在数组就在j的位置上。因为根据题意,第j个大的必然在(j-k, j+k)之间。他必然在[0, j+k-1]中第j个大的,前面已经有[0, j-1]了,所以从堆中取出来就是第j个大的。即在数组的第j个位置上。

方法2:

a[i]在排序后的位置是[i-k, i+k],a[i+2k]在排序后的位置是[i+k, i+3k],必然有a[i] <= a[i+2k],所以数组a里实际上有2k个各自有序的、交错的子序列,如a1={a[0], a[2k], a[4k]...},a2={a[1], a[2k+1], a[4k+1], ...} 
所以可以用2k-路归并排序,用一个大小为2k的小顶堆辅助归并,时间复杂度是O(n*log2k)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值