栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

算法导论 5 线性时间排序

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法导论 5 线性时间排序

算法导论 5-线性时间排序

  • 1. 决策树
    • a. 用决策树来表示排序算法的过程
    • b. 用决策树的表达方式比较排序算法
  • 2. 线性时间排序
    • a. 计数排序(Counting Sort)
    • b. 基数排序(Radix Sort)

目前已知最好的排序算法是,随机算法,非常复杂,其时间复杂度为 Θ ( n l g l g n ) Theta(nsqrt {lglgn}) Θ(nlglgn ​)

1. 决策树

a. 用决策树来表示排序算法的过程

比较排序可以被抽象为一颗决策树(算法导论 P191)

例子: 对无序数组 < a 1 , a 2 , a 3 > 进行排序,可以得到如下决策树,图中1、2、3代表数组下标:

以根节点为例,若 a 1 < = a 2 a_{1}<=a_{2} a1​<=a2​,则走向二叉树左边;若 a 1 > a 2 a_{1}>a_{2} a1​>a2​,则走向二叉树右边

#mermaid-svg-Lng3s8HP4ScR06wz .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Lng3s8HP4ScR06wz .label text{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .node rect,#mermaid-svg-Lng3s8HP4ScR06wz .node circle,#mermaid-svg-Lng3s8HP4ScR06wz .node ellipse,#mermaid-svg-Lng3s8HP4ScR06wz .node polygon,#mermaid-svg-Lng3s8HP4ScR06wz .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Lng3s8HP4ScR06wz .node .label{text-align:center;fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .node.clickable{cursor:pointer}#mermaid-svg-Lng3s8HP4ScR06wz .arrowheadPath{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Lng3s8HP4ScR06wz .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Lng3s8HP4ScR06wz .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Lng3s8HP4ScR06wz .edgeLabel rect{opacity:0.9}#mermaid-svg-Lng3s8HP4ScR06wz .edgeLabel span{color:#333}#mermaid-svg-Lng3s8HP4ScR06wz .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Lng3s8HP4ScR06wz .cluster text{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Lng3s8HP4ScR06wz .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Lng3s8HP4ScR06wz text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Lng3s8HP4ScR06wz .actor-line{stroke:grey}#mermaid-svg-Lng3s8HP4ScR06wz .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Lng3s8HP4ScR06wz .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Lng3s8HP4ScR06wz #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Lng3s8HP4ScR06wz .sequenceNumber{fill:#fff}#mermaid-svg-Lng3s8HP4ScR06wz #sequencenumber{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Lng3s8HP4ScR06wz .messageText{fill:#333;stroke:#333}#mermaid-svg-Lng3s8HP4ScR06wz .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Lng3s8HP4ScR06wz .labelText,#mermaid-svg-Lng3s8HP4ScR06wz .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Lng3s8HP4ScR06wz .loopText,#mermaid-svg-Lng3s8HP4ScR06wz .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Lng3s8HP4ScR06wz .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Lng3s8HP4ScR06wz .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Lng3s8HP4ScR06wz .noteText,#mermaid-svg-Lng3s8HP4ScR06wz .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Lng3s8HP4ScR06wz .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Lng3s8HP4ScR06wz .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Lng3s8HP4ScR06wz .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Lng3s8HP4ScR06wz .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .section{stroke:none;opacity:0.2}#mermaid-svg-Lng3s8HP4ScR06wz .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Lng3s8HP4ScR06wz .section2{fill:#fff400}#mermaid-svg-Lng3s8HP4ScR06wz .section1,#mermaid-svg-Lng3s8HP4ScR06wz .section3{fill:#fff;opacity:0.2}#mermaid-svg-Lng3s8HP4ScR06wz .sectionTitle0{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .sectionTitle1{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .sectionTitle2{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .sectionTitle3{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Lng3s8HP4ScR06wz .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .grid path{stroke-width:0}#mermaid-svg-Lng3s8HP4ScR06wz .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Lng3s8HP4ScR06wz .task{stroke-width:2}#mermaid-svg-Lng3s8HP4ScR06wz .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .taskText:not([font-size]){font-size:11px}#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Lng3s8HP4ScR06wz .task.clickable{cursor:pointer}#mermaid-svg-Lng3s8HP4ScR06wz .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Lng3s8HP4ScR06wz .taskText0,#mermaid-svg-Lng3s8HP4ScR06wz .taskText1,#mermaid-svg-Lng3s8HP4ScR06wz .taskText2,#mermaid-svg-Lng3s8HP4ScR06wz .taskText3{fill:#fff}#mermaid-svg-Lng3s8HP4ScR06wz .task0,#mermaid-svg-Lng3s8HP4ScR06wz .task1,#mermaid-svg-Lng3s8HP4ScR06wz .task2,#mermaid-svg-Lng3s8HP4ScR06wz .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutside0,#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutside2{fill:#000}#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutside1,#mermaid-svg-Lng3s8HP4ScR06wz .taskTextOutside3{fill:#000}#mermaid-svg-Lng3s8HP4ScR06wz .active0,#mermaid-svg-Lng3s8HP4ScR06wz .active1,#mermaid-svg-Lng3s8HP4ScR06wz .active2,#mermaid-svg-Lng3s8HP4ScR06wz .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Lng3s8HP4ScR06wz .activeText0,#mermaid-svg-Lng3s8HP4ScR06wz .activeText1,#mermaid-svg-Lng3s8HP4ScR06wz .activeText2,#mermaid-svg-Lng3s8HP4ScR06wz .activeText3{fill:#000 !important}#mermaid-svg-Lng3s8HP4ScR06wz .done0,#mermaid-svg-Lng3s8HP4ScR06wz .done1,#mermaid-svg-Lng3s8HP4ScR06wz .done2,#mermaid-svg-Lng3s8HP4ScR06wz .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Lng3s8HP4ScR06wz .doneText0,#mermaid-svg-Lng3s8HP4ScR06wz .doneText1,#mermaid-svg-Lng3s8HP4ScR06wz .doneText2,#mermaid-svg-Lng3s8HP4ScR06wz .doneText3{fill:#000 !important}#mermaid-svg-Lng3s8HP4ScR06wz .crit0,#mermaid-svg-Lng3s8HP4ScR06wz .crit1,#mermaid-svg-Lng3s8HP4ScR06wz .crit2,#mermaid-svg-Lng3s8HP4ScR06wz .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Lng3s8HP4ScR06wz .activeCrit0,#mermaid-svg-Lng3s8HP4ScR06wz .activeCrit1,#mermaid-svg-Lng3s8HP4ScR06wz .activeCrit2,#mermaid-svg-Lng3s8HP4ScR06wz .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Lng3s8HP4ScR06wz .doneCrit0,#mermaid-svg-Lng3s8HP4ScR06wz .doneCrit1,#mermaid-svg-Lng3s8HP4ScR06wz .doneCrit2,#mermaid-svg-Lng3s8HP4ScR06wz .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Lng3s8HP4ScR06wz .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Lng3s8HP4ScR06wz .milestoneText{font-style:italic}#mermaid-svg-Lng3s8HP4ScR06wz .doneCritText0,#mermaid-svg-Lng3s8HP4ScR06wz .doneCritText1,#mermaid-svg-Lng3s8HP4ScR06wz .doneCritText2,#mermaid-svg-Lng3s8HP4ScR06wz .doneCritText3{fill:#000 !important}#mermaid-svg-Lng3s8HP4ScR06wz .activeCritText0,#mermaid-svg-Lng3s8HP4ScR06wz .activeCritText1,#mermaid-svg-Lng3s8HP4ScR06wz .activeCritText2,#mermaid-svg-Lng3s8HP4ScR06wz .activeCritText3{fill:#000 !important}#mermaid-svg-Lng3s8HP4ScR06wz .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Lng3s8HP4ScR06wz g.classGroup text .title{font-weight:bolder}#mermaid-svg-Lng3s8HP4ScR06wz g.clickable{cursor:pointer}#mermaid-svg-Lng3s8HP4ScR06wz g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Lng3s8HP4ScR06wz g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Lng3s8HP4ScR06wz .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Lng3s8HP4ScR06wz .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Lng3s8HP4ScR06wz .dashed-line{stroke-dasharray:3}#mermaid-svg-Lng3s8HP4ScR06wz #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz .commit-id,#mermaid-svg-Lng3s8HP4ScR06wz .commit-msg,#mermaid-svg-Lng3s8HP4ScR06wz .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Lng3s8HP4ScR06wz g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Lng3s8HP4ScR06wz g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Lng3s8HP4ScR06wz g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Lng3s8HP4ScR06wz .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Lng3s8HP4ScR06wz .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Lng3s8HP4ScR06wz .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Lng3s8HP4ScR06wz .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Lng3s8HP4ScR06wz .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Lng3s8HP4ScR06wz .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Lng3s8HP4ScR06wz .edgeLabel text{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Lng3s8HP4ScR06wz .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Lng3s8HP4ScR06wz .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Lng3s8HP4ScR06wz #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Lng3s8HP4ScR06wz .note-edge{stroke-dasharray:5}#mermaid-svg-Lng3s8HP4ScR06wz .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Lng3s8HP4ScR06wz .error-icon{fill:#522}#mermaid-svg-Lng3s8HP4ScR06wz .error-text{fill:#522;stroke:#522}#mermaid-svg-Lng3s8HP4ScR06wz .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Lng3s8HP4ScR06wz .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Lng3s8HP4ScR06wz .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Lng3s8HP4ScR06wz .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Lng3s8HP4ScR06wz .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Lng3s8HP4ScR06wz .marker{fill:#333}#mermaid-svg-Lng3s8HP4ScR06wz .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-Lng3s8HP4ScR06wz { color: rgba(0, 0, 0, 0.75); font: ; } 1:2 2:3 123 1:3 132 312 1:3 213 2:3 231 321

定理:
若存在无序数组 A = < a 1 , a 2 , a 3 , a 4 , . . . , a n > A= A=,对数组 A A A进行排序,需要对数组中的元素 a i a_i ai​和 a j a_j aj​进行比较;如此可生成一棵树,左边子树对比 a i < = a j a_i<=a_j ai​<=aj​,右边子树比应该 a i > a j a_i>a_j ai​>aj​,每一个叶节点表示一次比较(排序)

b. 用决策树的表达方式比较排序算法

为一个 n n n维数组绘制一颗决策树,决策树列出了算法的所有可能结果

证明: 决策树深度的最小值是 n l o g n nlogn nlogn
已知条件:决策树中的叶节点个数为 n ! n! n!(数组中所有数的全排列),证明过程如下:
         设树的深度为 h h h,则:
                 2 h > = n ! 2^{h} >= n! 2h>=n!
         两边同时取对数,得到:
                 h > = l o g n ! h >= log n! h>=logn!
        且已知(斯特林公式):
                 n ! > = ( n / e ) n n!>=(n/e)^n n!>=(n/e)n
                 l o g n ! = ( l o g n + l o g ( n − 1 ) + l o g ( n − 2 ) + . . . + l o g 2 + l o g 1 ) > = l g ( n / e ) n logn!=(logn+log(n-1)+log(n-2)+...+log2+log1)>=lg(n/e)^n logn!=(logn+log(n−1)+log(n−2)+...+log2+log1)>=lg(n/e)n
        由此得到:
                 h > = l o g n ! > = n l o g ( n / e ) = n l o g ( n / e ) h>=logn!>=nlog(n/e)=nlog(n/e) h>=logn!>=nlog(n/e)=nlog(n/e)

比较类排序算法,所用排序时间的下届就是决策树的深度。由此可知,归并排序和堆排序是监禁最优的,依赖于 n n n

2. 线性时间排序

由上面决策树高度可知,比较模型的时间在 n l o g n nlogn nlogn,下面介绍两个线性时间排序算法

a. 计数排序(Counting Sort)

输入: A [ 1 , 2 , 3 , . . . , n ] A[1, 2,3,...,n] A[1,2,3,...,n],其中 A [ i ] ∈ { 1 , . . . , K } A[i]{in}{1,...,K} A[i]∈{1,...,K},即 A [ i ] A[i] A[i]为 1 1 1到 K K K之间的整数
输出: A A A的排序序列

计数排序代码如下,升序排序:

# 定义一个长度为K的数组
C = [0 for _ in range(K+1)] 
B = [0 for _ in range(len(A))]

#计算出A中等于i的元素个数
for i in range(len(A)):
	C[A[i]] += 1
	
#计算出A中小于i的元素个数
for j in range(1, K+1):
	C[j] += C[j-1]

for i in range(len(A), -1):
	B[C[A[i]-1] = A[i]
	C[A[i]] -= 1

例子: A = [ 4 , 1 , 3 , 4 , 3 ] A=[4,1,3,4,3] A=[4,1,3,4,3], C = [ 0 , 0 , 0 , 0 , 0 ] C=[0,0,0,0,0] C=[0,0,0,0,0]
        第一步,计算 C C C
                 C = [ 0 , 1 , 0 , 2 , 2 ] C=[0,1,0,2,2] C=[0,1,0,2,2]
                 C = [ 0 , 1 , 1 , 3 , 5 ] C=[0,1,1,3,5] C=[0,1,1,3,5]
      第二步,计算 B B B
                 B = [ 0 , 0 , 3 , 0 , 0 ] B=[0, 0,3,0,0] B=[0,0,3,0,0]
                 C = [ 0 , 1 , 1 , 2 , 5 ] C=[0,1,1,2,5] C=[0,1,1,2,5]

                 B = [ 0 , 0 , 3 , 0 , 4 ] B=[0,0,3,0,4] B=[0,0,3,0,4]
                 C = [ 0 , 1 , 1 , 2 , 4 ] C=[0,1,1,2,4] C=[0,1,1,2,4]

总结:
计数排序的时间复杂度为: Θ ( n + k ) Theta(n+k) Θ(n+k),其需要额外的大小为 k k k的存储空间;
计数排序的时间复杂度取决于 k k k,若 k < = n k<=n k<=n,时间复杂度为 Θ ( n ) Theta(n) Θ(n);若 k = 2 n k=2^n k=2n
如果 k < n l o g n k

计数排序具有稳定性,一个稳定性算法保证了相等元素的相对顺序

计数排序对缓存要求比较多,在实际中,计数排序并不那么快

b. 基数排序(Radix Sort)

基数排序用来在线性时间内处理大规模数据,基本思想是先对最后一位排序,按位排序,从最低为到最高位,每一位的排序需要有一个稳定性算法来进行排序

例子:
有如下数组:

  • 3 2 9
  • 4 5 7
  • 6 5 7
  • 8 3 9
  • 4 3 6
  • 7 2 0
  • 3 5 5

1)先对个位进行排序,若遇到相等的数,总是保持其相对位置,可得到如下数组

  • 7 2 0
  • 3 5 5
  • 4 3 6
  • 4 5 7
  • 6 5 7
  • 3 2 9
  • 8 3 9

2)对十位进行排序,得到如下数组:

  • 7 2 0
  • 3 2 9
  • 4 3 6
  • 8 3 9
  • 3 5 5
  • 4 5 7
  • 6 5 7

3)对百位进行排序,得到如下数组:

  • 3 2 9
  • 3 5 5
  • 4 3 6
  • 4 5 7
  • 6 5 7
  • 7 2 0
  • 8 3 9

证明:
      正确性
对已经排序的数字位进行归纳, t t t位
通过归纳假设,在 t t t之前的位已经排好序, t − 1 t-1 t−1位
对第 t t t位进行排序,有两种情况:

  • 如果两元素相同,相对位置不变(稳定性),保持原序
  • 如果两元素不同,那么调整其得到正确位置

利用计数排序作为辅助算法,假设有 n n n个整数,每个整数有 b b b bits(二进制整数设为 b b b比特长,取值范围在 0 0 0~ 2 b − 1 2^{b} -1 2b−1),把每个整数拆成 b / r b/r b/r位数字,每个是 r r r比特长,基于 2 r 2^r 2r进制来表示这个数(相对于二进制、十进制),每位数的范围在 0 0 0~ 2 r 2^r 2r间,一共有 b / r b/r b/r轮, K K K值为 2 r 2^r 2r。

时间复杂度
Θ [ ( b / r ) ∗ ( n + 2 r ) ] Theta[(b/r)*(n+2^r)] Θ[(b/r)∗(n+2r)]
对r求导,导为零的时候驻点,函数最小,此时 r = l o g n r=logn r=logn
因此,运行时间上界为 Θ ( b ⋅ n / l o g n ) Theta(b·n/logn) Θ(b⋅n/logn),只要 b < l o g n b

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268402.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号