今天才搞清楚排序算法的O(N*logN)是什么意思

以前光看了n多排序算法,知道仅通过比较的排序算法一共两种复杂度

O(N2)或O(N*lgN),

由于高数学的不好,之前一看到后者就放弃了思考,没有真正研究为什么会有个lgN,

这两天工作不是很忙,看了一下基础知识,有了一定的认识,算是初步搞清楚了原因.

写在这里算是一个记录,如果有问题也请大家指正.

 

 

说到N*lgN的算法大致上有几种:堆排序,归并排序,快速排序.

由于学习数据结构的时候老师讲过快速排序,(其实各种都讲过,我只记住了这种)我现在还是非常有印象的,

这几种排序实际都有一个共同点,这个共同点让他们有了lgN的特性.

 

都是使用了分治算法,把大集合通过分治,形成小集合,小集合的排序再次递归更小集合,直到1个(还可能是2个或3个)元素为止.

这样对于整个集合来讲,每次递归都是处理2个元素数量是1/2当前元素数量的新集合,

f(x) = f(x/2) + a (有限极小数)

这个特点在堆排序和归并排序中尤为突出,他们是绝对的遵循2分法的.而快速排序结果是随机的,如果点呗,可能出现O(N*N)的可能性

 

下面用堆排序为例说明一下NlgN:

为了让更多人明白,我简单把堆排序说一下:

堆排序就是把原来输入的值串,当成一棵完全2叉树,每次找最大值的时候,都是把数的左右子节点比较,把大于自己的最大的一个跟自己互换,找到一个后,重新找剩下的n-1个,一直到最终找完所有节点.

由于递归使用的是深度优先,每次都会从最底层往上找起,每次找的次数假设是F(x),则其需要找两个子树F(x/2)并且等两个子树处理完后,比较2次(子树的根比较一次,跟自己比较一次)如果连移动都算上,是3次操作

值的注意的是,由于最初排列过了以后,找子树的时候只要找那颗被破坏了的子树即可,

另一颗排过序了的不需要再找了. (这个我自己都感觉说的不明白,如果实在不行,大家再去看看相关资料吧)

这样分析下来,找第x个节点的操作次数为: f(x) <= f((x-1)/2) +3 (当然,我理解算成 + 2也行,x-1是把根去掉)

由于当x为2的整次方倍 + 1 的时候,正好是这个数值,当其他的情况 也不大于这个值

所以我们可以就使用最大值的情况 f(x) = f((x-1)/2) + 3; 为了计算更容易

直接 f(x) = f(x/2) + 3

 f(x/2) = f(x/4) + 3

......

 f(x/2m-1) = f(x/2m) + 3   (2m>=x)  <= f(1)+3 < 3;

由于一共m个算式 加起来是 f(x) = 3m 而 m = log(2)(x)

f(x)=3log(2)(x);

而计算f(1)+f(2) + ... + f(n)的时候,我们把他分城 m段(m= log(2)(n)) (分别为1,2,4,8,...2m-1)个元素(当然最后一端可能没有那么多)

求他们的和的话就是

2m-1(m-1) + 2m-2(m-2) + ....<2m-1m + 2m-2m + ... < 2mm 而m = log(2)(N)

 2mm =  2log(2)(n)*log(2)(n) = N * log(2)(N)

得证 哈哈


转载地址http://blog.csdn.net/coollangzi/article/details/6016041


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值