算法导论 第八章 线性时间排序(python)
比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)}
本章主要介绍几个线性时间排序:(运算排序非比较排序)计数排序O(k+n)基数排序O()
第一节:用决策树分析比较排序的下界
决策树:倒数第二层满,第一层可能满的二叉树,它用来表示所有元素的比较操作{于此来分析下界},忽略控制,移动操作

1:2 #A[1]和A[2]比 <= 走左边 >走右边
<3,1,2> 最后的结果 下标对应排序顺序
如A=[5,6,4]-->1:2 <= -->2:3 > -->1:3 > ---><3,1,2>[4,5,6]
看图可知有6钟可能的对比3!(也就是n!)
高度是他要对比的次数h = Ω(n lg n)
n! <= 2**h#数据结构内容
推出8.2:堆排序和归并排序都是渐进最优的比较排序算法
二计数排序
基本思想:对于每个元素x,确定小于x的元素个数
适用范围:小范围 x的跨度比较小的整数排序#跨度过大如0-1000辅助函数C[1000]
稳定性:稳定
时间复杂度:Θ(k+n)
实现:
def COUNTING_SORT(A,B,k):
#A要排序的函数
#B保存排序后的结果
#k A中x的最大值 [0,k] C = list() #临时保存记录x前面的个数
for i in range(k+1):#[0,k]
C.append(0) for j in range(len(A)):
C[A[j]] += 1 #记录A[j] == i C[i]记一个数 这是一个转换 似于hash的思想 for i in range(1,k+1):
C[i] = C[i] + C[i-1] #计算小于x的元素个数 for j in range(len(A)-1,-1,-1): # 从后想前借B排序[0,len(A))
#print(C[A[j]])
B[C[A[j]]-1] = A[j] #B下标从0开始
C[A[j]] -= 1 if __name__ == "__main__":
A = [2,5,3,0,2,3,0,3]
B = list()
for i in range(len(A)): #B初始化?还有没有别的方法
B.append(0)
COUNTING_SORT(A,B,5)
print(B) '''
>>>
============= RESTART: F:/python/algorithms/8_2_counting_sort.py =============
[0, 0, 2, 2, 3, 3, 3, 5] win7 python3.5.1
'''
8.3基数排序(radix sort)
基本思想:按关键字的各个值来排序
排序方式:LSD 由右向左排; MSD 由左向右排
稳定性:稳定
基数:计算的基数就是基本的单元数。比如10进制的基数就是10,二进制的基数就2,八进制的基数是8等等
基数排序:一位一位的对比排序(msd)

arr = list()
res = list()
hash = list()
n = int() def maxbit():
_max = 0
temp = list()
for i in arr:
temp.append(i) for i in range(n):
tt = 1
while (temp[i] //10) >0:
tt += 1
temp[i] //= 10
if _max < tt:
_max = tt print("最大%d位"%_max)
return _max def radixSort():
for i in range(n):
res.append(0)#初始化为0
nbit = maxbit() #最大的数有多少位
radix = 1
#计数排序
for j in range(10):
hash.append(0) for i in range(1,nbit+1):#[1,3]
for j in range(10):
hash[j] = 0
for j in range(n):
tmp = (arr[j]//radix) % 10
hash[tmp] += 1
for j in range(1,10):
hash[j] += hash[j-1]
for j in range(n-1,-1,-1):
tmp = (arr[j]//radix) %10
hash[tmp] -= 1
#print(hash[tmp])
res[hash[tmp]] = arr[j] for j in range(n):
arr[j] = res[j]
print(arr)
radix *= 10; if __name__ == "__main__":
n = int(input("输入元素个数:"))
print("输入%d个元素"%n)
for i in range(n):
arr.append(int(input("第"+str(i+1)+'个:')))
radixSort()
print("排序后",arr)
'''
============== RESTART: F:/python/algorithms/8_3_radix_sort.py ==============
输入元素个数:5
输入5个元素
第1个:54321
第2个:1
第3个:4321
第4个:21
第5个:321
最大5位
[54321, 1, 4321, 21, 321]
[1, 54321, 4321, 21, 321]
[1, 21, 54321, 4321, 321]
[1, 21, 321, 54321, 4321]
[1, 21, 321, 4321, 54321]
排序后 [1, 21, 321, 4321, 54321]
>>> 环境:win7 + python3.5.1
'''
8.4桶排序
思想:同hash = n //x
稳定性:

def bucketSort(a,max):
#a 待排序list
#数组中的最大值的范围
if len(a) == 0 and max <1 :
return
buckets = list() #建立容纳max个数的list
for i in range(max):
buckets.append(0) #初始化 #计数
for i in range(len(a)):
buckets[a[i]] += 1 #排序
j = 0
for i in range(max):
while buckets[i] >0:
buckets[i] -= 1
a[j] = i
j += 1 if __name__ == "__main__":
a = [8,2,3,4,3,6,6,3,9]
print("排序前a:",a)
bucketSort(a,10) #桶排序
print("排序后a:",a) '''
============== RESTART: F:/python/algorithms/8_4_bucket_sort.py ==============
排序前a: [8, 2, 3, 4, 3, 6, 6, 3, 9]
排序后a: [2, 3, 3, 3, 4, 6, 6, 8, 9]
>>> win7 + python3.5.1
'''
参考引用:
http://www.wutianqi.com/?p=2378
https://zh.wikipedia.org/wiki/%E5%9F%BA%E6%95%B0_(%E6%95%B0%E5%AD%A6)
http://www.cnblogs.com/skywang12345/p/3602737.html#a32
算法导论 第八章 线性时间排序(python)的更多相关文章
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- 《算法导论》 — Chapter 8 线性时间排序
序 到目前为止,关于排序的问题,前面已经介绍了很多,从插入排序.合并排序.堆排序以及快速排序,每一种都有其适用的情况,在时间和空间复杂度上各有优势.它们都有一个相同的特点,以上所有排序的结果序列,各个 ...
- "《算法导论》之‘排序’":线性时间排序
本文参考自一博文与<算法导论>. <算法导论>之前介绍了合并排序.堆排序和快速排序的特点及运行时间.合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O( ...
- Python线性时间排序——桶排序、基数排序与计数排序
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...
- 《算法导论》 — Chapter 7 高速排序
序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均 ...
- 算法导论 第一章and第二章(python)
算法导论 第一章 算法 输入--(算法)-->输出 解决的问题 识别DNA(排序,最长公共子序列,) # 确定一部分用法 互联网快速访问索引 电子商务(数值算 ...
- 《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法
自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导 ...
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...
- 算法导论 第九章 中位数和顺序统计量(python)
第i个顺序统计量:该集合中第i小的元素(建集合排序后第i位 当然算法可以不排序) 中位数:集合中的中点元素 下中位数 上中位数 9.1最大值和最小值 单独的max或min每个都要扫一遍 n-1次比较 ...
随机推荐
- Oracle 单引号与双引号的区别
双引号一般是用来转义的,如果alias里面有空格或其它保留符号,必须使用双引号.而单引号是用来特制的,比如字符串的引用,日期字符串的引用,都必须包括在单引号中,可以参与运算或其它表达式中.两者不可混用 ...
- POJ1961(kmp中Next数组的性质)
对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元. ; int n, kase, Next[maxn]; char ch[maxn]; inli ...
- 506 Relative Ranks 相对名次
给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌.前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silve ...
- jQuery attr() 源码解读
我们知道,$().attr()实质上是内部调用了jQuery.access方法,在调用时jQuery.attr作为回调传入.在通过种种判断(参看jQuery.access()方法)之后,取值和赋值最后 ...
- 动手实现 Redux(六):Redux 总结
不知不觉地,到这里大家不仅仅已经掌握了 Redux,而且还自己动手写了一个 Redux.我们从一个非常原始的代码开始,不停地在发现问题.解决问题.优化代码的过程中进行推演,最后把 Redux 模式自己 ...
- P1739 表达式括号匹配
题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”:否则返 ...
- 关于对象.style currentstyle 的区别
对象.style的方式只能获取行内写法的样式,但是外部引入的或者写在head里面的就无法获取,只能用currentstyle.
- Java&Xml教程(十)XML作为属性文件使用
我们通常会将Java应用的配置参数保存在属性文件中,Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件,也可以是XML文件. 在本案例中,將会向大家介 ...
- ArrayList不同循环方式
一: ArrayList<String> list = new ArrayList<String>(); list.add("1"); list.add ...
- 在CentOS上把Git从1.7.1升级到1.7.12.4
在CentOS上把Git从1.7.1升级到1.7.12.4 摘要:本文记录了在CentOS 6.3上,把Git从1.7.1升级到1.7.12.4的过程. 1. 概述 在我做的一个项目中,最近我对生产服 ...