分治算法排序

分治: 将大数组拆分后排序

假定对长度为N的数组进行排序,如将数组一分为二,数组一:[0, N/2), 数组二: [N/2, N)。分别对两个数组进行排序,然后合并排序后的结果,得到原数组的排序结果。
每个子数组只有原数组大小的1/2,耗时只需1/4。加上数组合并的额外时间,和节省的时间相比可以忽略不计, 最终消耗为原1/2左右。
同理,把两个子数组再往下拆分,直到子数组中只有两个元素。
时间复杂度由原来的O(N^2)简化到O(N*logN)

推导:
假定N个元素的数组归并排序的算法计算时间是T(N),那么N/2个元素的子数组排序时间为T(N/2),合并过程的计算时间为N的线性函数,即O(N)。因此T(N) = 2T(N/2) + O(N). 解这个递归方程,即得T(N) = O(N*logN).

如果有多应用/服务器,可以先拆分,分发到不同服务器处理,然后再合并处理结果。

云计算的关键之一,就是将非常大的问题,自动分解到许多计算能力并不是很强的机器上,共同完成。
Google给出的解决工具是一个叫MapReduce的程序,根本原理就是分治算法。

以上内容摘自:《数学之美》第二版 (吴军老师著)

百万数据排序耗时比较 (运行机器信息: 4核,8G内存)

直接插入排序: 执行一次,平均耗时305秒

分治+直接插入排序:执行100次,平均耗时145毫秒

两个线程 + 分治 + 直接插入排序:执行100次,平均耗时93毫秒

运行机器信息: win7, 4核,8G内存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值