算法导论:线性时间排序

线性时间排序

对于比较排序来说,在排序的最终结果中,各元素的次序依赖于它们之间的比较。我们可以看到下图中的比较排序算法,在最坏情况下情况下,时间复杂度至少O(nlgn)。


线性时间排序

从图中我们可以较为清楚的看到各算法的时间复杂度,下面将证明对包含n个元素的输入序列来说,在最坏情况下,时间复杂度至少都是O(nlgn)。


决策树

比较排序可以被抽象为一颗决策树,那什么是决策树呢?比如上图所示,现在要出去相亲,首先判断年龄,如果大于30岁,那就直接不见了,小于30再考虑其他条件。之后,我们依次判断了,长相,收入,都满足了要求,于是决定去见上一面。
决策树是一颗完全二叉树(美式定义:要么有左右孩子、要么就没有孩子),非叶子结点都是一个逻辑判断,每个分支都是判断结果。
决策树

如上图所示,现在有三个数x,y,z。我们可以构建出如图所示的决策树,根结点是x和y比较,如果x≤y,再比较y和z的大小,如果x≥y,则比较x和z的大小。这里有三个数,并且是互异的,所以大小排列情况会有6种,如果有n个互译的数,那就是n!种。当x=6,y=8,z=5时,最后就会得到<z,x,y>这个结果,也就是<5,6,8>。


决策树

在最坏情况下,比较的次数,就是树的高度,2的h次方表示的是,总共的结点,肯定比叶子结点多,最后可以解出,h是大于等于O(nlgn)的。
介绍完了比较排序的时间复杂度,现在该介绍线性时间排序了。

计数排序

问题描述:给定一个无序的序列,对序列进行排序,使之成为有序。
基本思想:对于每一个输入元素x,确定小于x的元素个数,可以直接把x放到它在输出数组中的位置上,但是需要略微修改,因为一个位置不能存放两个元素

算法的主要思想就是找到比元素x小的元素个数,元素x是待排序的元素。
那这个排序过程如何实现的呢?


计数排序

A数组就是我们的待排序序列{2,5,3,0,2,3,0,3},C数组是用来记录比元素x小的元素个数,因为A中的数是0-5,所以B中的数组大小也是0~5,上标表示的就是A中的数。


计数排序

我们现在先记录,每个元素的个数是多少,现在指向2所以2的个数标记为1。
计数排序

指向5,所以5的个数变为1。
计数排序

在完成后,数组C中记录下了,各元素的个数。不过我们最终要的结果是记录下比元素x小的元素个数,所以这里面的数字还要进行简单的变换。


计数排序

现在我们将1中的0变更为2,这个数字表示的是小于等于1的数,也就是2,下面我们再记录小于等于2的数。
计数排序

小于等于2的个数,就是前面小于等于1的个数,再加上2自身的个数,结果为4。
计数排序

在完成更新后,所得如上图所示,每个数组中记录的数,就是小于等于自身的元素的个数。
排序

B数组就是我们最后的排序结果,对A数组从右向左进行遍历,这样是为了让排序是稳定的,排序的稳定是指,对于相同的数字,比如这里的2,在排序完成后,并不改变它们的相对次序。
计数排序

这里我们对3进行排序,去B数组查找,小于等于3的个数,找到为7就直接放在上标为7的数组中,并且将B中记录的数字减1。
计数排序

排序完成的结果,如图所示。


计数排序时间复杂度

因为要遍历两遍A数组,以及遍历一遍B数组,所以时间复杂度为O(n)+O(n)+O(k)=O(k+n),当k=O(n)时T(n)=O(n)。

基数排序

基本思想:基数排序的总体思路就是将待排序数据拆分成多个关键字进行排序,实质是多关键字排序。
注意事项:选择低位优先排序,因为如果按照高位优先排序的,当排到次高位时,还需要返回看高位数字,相对来说比较麻烦。

基数排序

例如,现在给出了7个数字,我们要对其进行排序,在这种位数很多的情况下,我们优先选择的就是基数排序。在基数排序时,优先对个位数进行排序,也就是最右边的那位数。
基数排序

要对个位数数字进行排序,那选择什么样的方法对其进行排序呢?只要是线性时间的排序,都是可行的,这里我们选择之前讲过的计数排序。
基数排序

再对十位数上面的数字进行排序。
基数排序

在完成排序后,可以得到上图的结果。
时间复杂度分析:
每个数字都是d位数,比如说这里都是三位数。每一次排序,都是计数排序,时间复杂度为O(n+k),总共d次计数排序。所以时间复杂度为O(n+k)d=O(d(n+k))。

桶排序

一般来说,只有在输入数据是给定的一个范围内,并且还是服从均匀分布的,才会使用桶排序。


桶排序

A中就是给出的数据,这些数据都是0到1之间的数,B中就是我们准备的10个桶,数字0到9表示的是数据小数点后一位的数。


桶排序

开始进行排序,第一个数字是0.78,所以放在了7号桶里面。
桶排序

当进行到0.72时依然是放到7号桶里面,不过要和0.78比较一下大小,然后进行排序。


桶排序

最后的排序结果,如图所示。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 12,464评论 0 15
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,761评论 0 13
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • 目录 0.树0.1 一般树的定义0.2 二叉树的定义 1.查找树ADT 2.查找树的实现2.1 二叉查找树2.2 ...
    王侦阅读 7,181评论 0 3
  • 5月19日,文史与文献研究会部分同仁应邀考察了梅江的三个古村落:田畈周、溪口周和祝宅。 【田畈周】 田畈周和溪口周...
    读史一得阅读 1,379评论 3 1