您的位置:首页 > 其它

线性时间排序

2012-04-17 22:14 141 查看
最近的几篇文章将都关于排序算法,希望能跟大家一起进步,一起深入的去理解排序问题的本质与思路。由于本人在算法方面还处于菜鸟阶段,所以文章的面向读者为广大算法入门人士,希望高手门高抬贵手。

本文将讨论线性时间排序算法,关于非线性时间算法将另开专题讨论。

开篇:御剑术---计数排序

计数排序,一言以蔽之,就是统计每个元素的个数,用来推断它最终的位置:显然,它的最终位置等于比它小的数的元素个数之和。所以只要累计所以比它小的元素的个数和就可以知道它的最终位置。

所以计数排序分两步,统计--累计

【统计】:就是把每个数出现的次数放在一个数组的每一项里

【累计】:就是让数组每项的值等于前面项的和

显然,我们希望元素本身的值作为数组下标,这样才能保证前面的项比后面的项代表的元素小。

def countingSort(arr):
MAX = 0
buf = [0]
result = range(len(arr))
for i in arr:
if i > MAX:
MAX = i
buf = [0 for i in range(MAX+1)]
for i in arr:
buf[i] += 1
for i in range(1,MAX+1):
buf[i] = buf[i-1] + buf[i]
for i in range(len(arr))[::-1]:
result[buf[arr[i]]-1] = arr[i]
buf[arr[i]] = buf[arr[i]]-1
return result


进阶:万剑诀---基数排序

属于御剑术的改良版,哪里改良?适用范围变广了。御剑术只能对单个关键字排序,而万剑诀可以对多个关键字排序。

基数排序,一言以蔽之:就是从低到高依次对每个关键字进行基数排序,结果就得到有序序列。这里用到了计数排序的稳定性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: