【转】对排序算法的深入探究

OI中有很多排序算法,冒泡排序,插入排序,快速排序,基数排序,以及神一般的bogo排序等等等等。

在这门不断追求速度的学科里,最快的排序方法是什么一直是信息学皇冠上的明珠。基数排序是线性的,但是却有非常大的局限性,仅仅基于比较的排序复杂度的下限是多少呢?

有一天,一个人出来妖言惑众:“基于比较的排序复杂度下限是O(n log n)的。”并且提出了伪证。

他用一棵二叉树来建立模型,通过对树的深度进行探究,从而推出排序的复杂度下限。于是人类停滞不前,再也没有人试图创新。

然而事实上,他的行为有着一个巨大的漏洞:那人试图利用大家对树的不甚了解以及其巧妙地误导,愚弄了大家。在此,我们来重新分析树的深度。

我们来真正思考真正的树要具有什么样的性质:根据生物课上所讲的,一棵树不可能无限的生长下去,也就是说一棵树的深度应该是常数;然而他的假树却不同,随着叶子的不断增加,树的深度是会跟着不断增加的——是一个发散的数列!这显然与树的深度不能无限增长这个生物知识相矛盾!虽然由于他巧妙地文字以及我智商的程度至今我还不清楚他是在哪一步偷天换日,将树的深度由有上限变成了没有上限,但既然我们已经知道他认为树的深度是O(log n)这点绝对是错的,我们就有理由继续深入思考。

然而,由于智商所限,我再也没有过一丝成果。我清楚地意识到我尚未领悟人类智慧的力量,于是我开始四处遍寻高人。为了能抹去这个多年笼罩在大家头上的乌云,让人类文明进入新的时代,我曾以囚徒身份进了北京八十监狱寻找至今没人知道身份的黄半仙,曾请教过湖北一位统领全宇宙跳蚤的国王,却一直没能得到满意的结果。终于有一次,我跟随着黄半仙,来到了帝都航天大学吃特色菜(CTSC),在吃特色菜的过程中,我见到了人类智慧之神——Mato_No1。

Mato_No1上台讲述了自己的研究成果,他告诉了我一个惊天动地的消息:开了O2的set是O(1)的!

顿时,我感到一道曙光冲破了乌云:是不是只要我们将元素插入开了O2的set,再遍历输出,就能得到O(n)的排序方法了呢?这样子的话,那棵树的深度也是O(1)的啊。

然而事实却再一次给了我打击,我学习了set这个数据结构,然而我很不解的是他明明是一种叫做平衡树的东西进行维护,但是trajan告诉我,平衡树是O(log n)的。trajan大神与mato_no1大神的思维产生了碰撞,我一遍遍的回忆,终于意识到了真相:开了O2的set!

O2是什么?氧气啊。众所周知,树在有氧气的情况下,会进行呼吸作用!学科的知识再一次产生了交叉,生物学的知识推进了信息学的发展!我们必须明白,平衡树遇上O2进行呼吸作用后,究竟会有怎样惊人的效果!

然而我却再也没有见到mato_no1,据说他已经进了五道口男子职业技术学校,那里有更多更多的大神,我想,要知道信息学与生物学本质上的联系,也许只有那里的大神才能回答。为此,我于同年七月踏上了南下的火车,得到了进入五道口的机会,从而于明年暑假结束后去寻求真相。然而,没有想到的是,这个真相来的比我预料中的更早。

在昨天,通过一个偶然的机会,我看到了一个叫猪猪侠的大神所写的神奇数据结构Spaly。短短几行代码,却显示了其超高的水平,让我捉摸不透。由于智商差异过大,我只能体会其神奇却不知其原理。可没过多久,noip吧的前吧主却对数据结构Spaly进行了解答!

http://tieba.baidu.com/p/3431234613

看了这段话,人类多年的疑惑在前吧主轻描淡写的话语中,已得到了解答。真相只有一个!

是的,单旋的Spaly,可以O(1)的完成平衡树的操作!这也与树的深度是常数这个科学道理是吻合的!我们可以想象,当set里的那棵平衡树遇到了氧气后,他进行着呼吸作用,每次再也不需要费力的进行双旋,深度也瞬间变成常数!无论树的叶子再怎么多,他的深度永远是常数!

至此,O(n)的排序方法诞生了。我们要感谢mato_no1大神与猪猪侠大神,当然还有对其进行了最终的总结的前吧主Foreseeable!此外还要感谢CCTV,感谢MTV,感谢父母,感谢祖国!

参考文献:

mato_no1在吃特色菜过程中的讲话

猪猪侠公开出来的代码

Foreseeable在贴吧里的发言

http://ydcydcy1.blog.163.com/blog/static/216089040201410266423552/

时间: 2024-10-31 18:28:14

【转】对排序算法的深入探究的相关文章

对排序算法的初步探究

初学排序算法,我觉得只需要掌握算法的精髓,没必要把所有算法都实现一遍,下面我会实现一些经典的排序算法.(均采用C++实现) 学习的排序算法包含: 1>插入排序(直接插入排序.希尔排序) 2>选择排序(简单选择排序.堆排序) 3>交换排序(快速排序.冒泡排序) 4>归并排序 5>基数排序 我认为初学者掌握基本的排序算法的思想即可,其他排序算法基于特定的数据结构和存储结构,遇到具体的实例再学习即可. 下面就开始学习了. 插入排序 插入排序:把一个数插入到一个有序的序列中,并要求插

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

排序算法比较及其应用

一.将各种数据排序 只要实现了Comparable接口的数据类型就可以被排序. 但要使算法能够灵活地用不同字段进行排序,则是后续需要考虑的问题. 1.指针排序 在Java中,指针操作是隐式的,排序算法操作的总是数据引用,而不是数据本身. 2.键不可变 如果在排序后,用例还可以改变键值,那么数组很可能就不是有序的了.类似,优先队列也会乱套. Java中,可以用不可变数据类型作为键来避免这个问题,如String,Integer,Double和File都是不可变的. 3.廉价交换 使用引用的另一个好处

选择排序 —— 排序算法系列

假设我们有如下一个数组: 使用选择排序算法对这个数组进行排序,步骤如下: 第 1 次 在下标0到6之间找到最小的数字,我们可以发现最小的数字是15,它在下标为4的位置上: 把下标4上面的数字跟下标0上面的数字互换,得到排序如下图的数组: 第 2 次 在下标1到6之间找到最小的数字,我们可以发现最小的数字是33,它在下标为5的位置上: 把下标5上面的数字跟下标1上面的数字互换,得到排序如下图的数组: 第 3 次 在下标2到6之间找到最小的数字,我们可以发现最小的数字是48,它在下标为5的位置上:

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O

七大常见排序算法总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.16 lutianfei 增加了归并排序说明 V2.0 2016.07.19 lutianfei 完善了排序算法的总结 排序另一种分法 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况

数据结构——各排序算法的比较

1.从时间复杂度比较  从平均时间复杂度来考虑,直接插入排序.冒泡排序.直接选择排序是三种简单的排序方法,时间复杂度都为O(n2),而快速排序.堆排序.二路归并排序的时间复杂度都为O(nlog2n),希尔排序的复杂度介于这两者之间.若从最好的时间复杂度考虑,则直接插入排序和冒泡排序的时间复杂度最好,为O(n),其它的最好情形同平均情形相同.若从最坏的时间复杂度考虑,则快速排序的为O(n2),直接插入排序.冒泡排序.希尔排序同平均情形相同,但系数大约增加一倍,所以运行速度将降低一半,最坏情形对直接

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time: