比较排序:各元素的次序依赖于它们之间的比较{插入排序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)

实现:

  1. def COUNTING_SORT(A,B,k):
  2. #A要排序的函数
  3. #B保存排序后的结果
  4. #k A中x的最大值 [0,k]
  5.  
  6. C = list() #临时保存记录x前面的个数
  7. for i in range(k+1):#[0,k]
  8. C.append(0)
  9.  
  10. for j in range(len(A)):
  11. C[A[j]] += 1 #记录A[j] == i C[i]记一个数 这是一个转换 似于hash的思想
  12.  
  13. for i in range(1,k+1):
  14. C[i] = C[i] + C[i-1] #计算小于x的元素个数
  15.  
  16. for j in range(len(A)-1,-1,-1): # 从后想前借B排序[0,len(A))
  17. #print(C[A[j]])
  18. B[C[A[j]]-1] = A[j] #B下标从0开始
  19. C[A[j]] -= 1
  20.  
  21. if __name__ == "__main__":
  22. A = [2,5,3,0,2,3,0,3]
  23. B = list()
  24. for i in range(len(A)): #B初始化?还有没有别的方法
  25. B.append(0)
  26. COUNTING_SORT(A,B,5)
  27. print(B)
  28.  
  29. '''
  30. >>>
  31. ============= RESTART: F:/python/algorithms/8_2_counting_sort.py =============
  32. [0, 0, 2, 2, 3, 3, 3, 5]
  33.  
  34. win7 python3.5.1
  35. '''

8.3基数排序(radix sort)

基本思想:按关键字的各个值来排序

排序方式:LSD 由右向左排; MSD 由左向右排

稳定性:稳定

基数:在数学上,基数,即集合中包含的元素的“个数”

基数:计算的基数就是基本的单元数。比如10进制的基数就是10,二进制的基数就2,八进制的基数是8等等

基数排序:一位一位的对比排序(msd)

  1. arr = list()
  2. res = list()
  3. hash = list()
  4. n = int()
  5.  
  6. def maxbit():
  7. _max = 0
  8. temp = list()
  9. for i in arr:
  10. temp.append(i)
  11.  
  12. for i in range(n):
  13. tt = 1
  14. while (temp[i] //10) >0:
  15. tt += 1
  16. temp[i] //= 10
  17. if _max < tt:
  18. _max = tt
  19.  
  20. print("最大%d位"%_max)
  21. return _max
  22.  
  23. def radixSort():
  24. for i in range(n):
  25. res.append(0)#初始化为0
  26. nbit = maxbit() #最大的数有多少位
  27. radix = 1
  28. #计数排序
  29. for j in range(10):
  30. hash.append(0)
  31.  
  32. for i in range(1,nbit+1):#[1,3]
  33. for j in range(10):
  34. hash[j] = 0
  35. for j in range(n):
  36. tmp = (arr[j]//radix) % 10
  37. hash[tmp] += 1
  38. for j in range(1,10):
  39. hash[j] += hash[j-1]
  40. for j in range(n-1,-1,-1):
  41. tmp = (arr[j]//radix) %10
  42. hash[tmp] -= 1
  43. #print(hash[tmp])
  44. res[hash[tmp]] = arr[j]
  45.  
  46. for j in range(n):
  47. arr[j] = res[j]
  48. print(arr)
  49. radix *= 10;
  50.  
  51. if __name__ == "__main__":
  52. n = int(input("输入元素个数:"))
  53. print("输入%d个元素"%n)
  54. for i in range(n):
  55. arr.append(int(input("第"+str(i+1)+'个:')))
  56. radixSort()
  57. print("排序后",arr)
  58. '''
  59. ============== RESTART: F:/python/algorithms/8_3_radix_sort.py ==============
  60. 输入元素个数:5
  61. 输入5个元素
  62. 第1个:54321
  63. 第2个:1
  64. 第3个:4321
  65. 第4个:21
  66. 第5个:321
  67. 最大5位
  68. [54321, 1, 4321, 21, 321]
  69. [1, 54321, 4321, 21, 321]
  70. [1, 21, 54321, 4321, 321]
  71. [1, 21, 321, 54321, 4321]
  72. [1, 21, 321, 4321, 54321]
  73. 排序后 [1, 21, 321, 4321, 54321]
  74. >>>
  75.  
  76. 环境:win7 + python3.5.1
  77. '''

8.4桶排序

思想:同hash = n //x

稳定性:

  1. def bucketSort(a,max):
  2. #a 待排序list
  3. #数组中的最大值的范围
  4. if len(a) == 0 and max <1 :
  5. return
  6. buckets = list() #建立容纳max个数的list
  7. for i in range(max):
  8. buckets.append(0) #初始化
  9.  
  10. #计数
  11. for i in range(len(a)):
  12. buckets[a[i]] += 1
  13.  
  14. #排序
  15. j = 0
  16. for i in range(max):
  17. while buckets[i] >0:
  18. buckets[i] -= 1
  19. a[j] = i
  20. j += 1
  21.  
  22. if __name__ == "__main__":
  23. a = [8,2,3,4,3,6,6,3,9]
  24. print("排序前a:",a)
  25. bucketSort(a,10) #桶排序
  26. print("排序后a:",a)
  27.  
  28. '''
  29. ============== RESTART: F:/python/algorithms/8_4_bucket_sort.py ==============
  30. 排序前a: [8, 2, 3, 4, 3, 6, 6, 3, 9]
  31. 排序后a: [2, 3, 3, 3, 4, 6, 6, 8, 9]
  32. >>>
  33.  
  34. win7 + python3.5.1
  35. '''



参考引用:

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)的更多相关文章

  1. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  2. 《算法导论》 — Chapter 8 线性时间排序

    序 到目前为止,关于排序的问题,前面已经介绍了很多,从插入排序.合并排序.堆排序以及快速排序,每一种都有其适用的情况,在时间和空间复杂度上各有优势.它们都有一个相同的特点,以上所有排序的结果序列,各个 ...

  3. "《算法导论》之‘排序’":线性时间排序

    本文参考自一博文与<算法导论>. <算法导论>之前介绍了合并排序.堆排序和快速排序的特点及运行时间.合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O( ...

  4. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  5. 《算法导论》 — Chapter 7 高速排序

    序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均 ...

  6. 算法导论 第一章and第二章(python)

    算法导论 第一章 算法     输入--(算法)-->输出   解决的问题     识别DNA(排序,最长公共子序列,) # 确定一部分用法     互联网快速访问索引     电子商务(数值算 ...

  7. 《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法

    自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导 ...

  8. 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)

    计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...

  9. 算法导论 第九章 中位数和顺序统计量(python)

    第i个顺序统计量:该集合中第i小的元素(建集合排序后第i位 当然算法可以不排序) 中位数:集合中的中点元素 下中位数 上中位数 9.1最大值和最小值 单独的max或min每个都要扫一遍 n-1次比较 ...

随机推荐

  1. Python标准库 os

    (掌握os模块,你需要了解Linux或类Unix系统下常用命令的操作) os.name  指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix' ...

  2. Codeforces Round #322 (Div. 2)

    水 A - Vasya the Hipster /************************************************ * Author :Running_Time * C ...

  3. 线段树(单点更新)/树状数组 HDOJ 1166 敌兵布阵

    题目传送门 /* 线段树基本功能:区间值的和,修改某个值 */ #include <cstdio> #include <cstring> #define lson l, m, ...

  4. 微信小程序生成分享图片,保存到本地

    1.页面 <canvas canvas-id="shareCanvas" style="width:600px;height:900px">< ...

  5. 纯js手动分页

    昨天让做个页面,后台提供所有数据,没有做好分页,需要前端js手动分页. 我参考了 http://www.cnblogs.com/jiechn/p/4095029.html 做了些许改动让分页效果更加完 ...

  6. ["1", "2", "3"].map(parseInt)

    为什么["1", "2", "3"].map(parseInt) 为 1,NaN,NaN; parseInt() parseInt() 函数 ...

  7. Mac Outlook 15 连接office365 一直跳出登录框的问题

    解决: 比如 原登录用户名密码为 abc@xxx.com 密码:***** 改一下outlook帐号中的登录用户名为:xxx.com\abc   密码为原来密码,尝试连接,连接状态会连上,但过会儿又提 ...

  8. filter和map的使用

    if ( this.dataAggridvue.filter( item => item.Accepted == true && item.InvoiceGroupCode != ...

  9. String 截取字符串#中间的文本

    通过正则实现: String regex = "#([^#]+)#"; @Test public void test() { String text = "#中俄建交七十 ...

  10. 【人工智能系列】python的Quepy库的学习

    第一篇 了解 什么是Quepy quepy是一个Python框架改造自然语言问题在数据库查询语言查询.它可以很容易地定制不同类型的问题,在自然语言和数据库查询.因此,用很少的代码,你可以建立自己的系统 ...