- 桶排序
- 原理:
将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。
桶排序适合用在外部排序,例如数据量较大内存中放不下就可以,用到桶排序。按照数据特征将数据分为m个有顺序的桶,在桶排序后合并即可。例如一年的10G的淘宝订单数据,按时间排序。但是我们的内存只有1G。可以将订单数据根据时间放入12个桶中,每个桶代表一个月份。将一月分的数据放入一月份的桶中。以此类推。再对同内数据进行快速排序,然后合并即可。(有的月份订单比较多比如十一月份因双十一的原因,有2G的订单数据。这种情况将桶再细分就可以了)
-
- 分析:
排序的数据有n个,我们分成m个桶,每个桶中就有k = n/m个元素
空间复杂度:O(n+m)
时间复杂度:桶内用快速排序所以T(n) = n + m*k*logk
由k = n/m得T(n) = n + n * log(n/m)
=n+n(logn - logm)
当m趋近于n时T(n)=O(n)
- 计数排序
- 原理:
需要三个数组,一个原始数据,一个数组负责计数。一个负责将计数后的数据存入输出说的有点抽象看代码吧
-
- 代码:
#encoding:utf-8
def run(lis):
#定义变量
max_num = 0
re = 0
index = len(lis)
#临时数组
result = [None] * index
#取出数组中最大值
for i in lis:
if i > max_num:
max_num = i
#根据最大值定义一个新的数组
lis_b = [0 for x in range (max_num + 1)]
#原始数组中取出数据,并在计数数组中相应下标中的数据加一
for i in lis:
lis_b[i] += 1
#将数据计数累计计数
for i in range(1,max_num +1):
lis_b[i] = lis_b[i - 1] + lis_b[i]
#从后往前遍历原始数组,根据计数数组将元素放入相应位置
for i in range(index-1,-1,-1):
result[lis_b[lis[i]] - 1] = lis[i]
lis_b[lis[i]] = lis_b[lis[i]] - 1
lis = result
return lis
-
- 分析:
空间复杂度:O(n+K) k为要排序数据的最大值
时间复杂度:O(n+k)
- 基数排序
- 原理:基数排序比较简单看图吧
-
- 分析:看图
堆排序在堆之后再写