线性时间排序
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
进阶:万剑诀---基数排序
属于御剑术的改良版,哪里改良?适用范围变广了。御剑术只能对单个关键字排序,而万剑诀可以对多个关键字排序。
基数排序,一言以蔽之:就是从低到高依次对每个关键字进行基数排序,结果就得到有序序列。这里用到了计数排序的稳定性。
相关文章推荐
- 算法导论之线性时间排序(3)
- 线性时间排序
- 线性时间排序的性能比较
- 线性时间排序
- 线性时间排序
- 《算法导论》第8章 线性时间排序 个人笔记
- 桶排序——以线性时间运行的排序方法
- 线性时间排序之基数排序
- 线性时间排序:计数排序、计数排序、桶排序
- 排序0-n^k-1范围内的n个数,要求时间复杂度为线性
- 线性时间排序-算法导论
- 麻省理工算法导论学习笔记(5)----线性时间排序
- 算法导论第八章-线性时间排序-Cpp代码实现
- 算法导论第8章线性时间排序答案
- 线性时间排序之计数排序
- 第八章 线性时间排序 8.2 计数排序
- 算法导论 学习笔记 第八章 线性时间内的排序
- 线性时间复杂度排序
- 线性时间排序
- 算法导论学习之线性时间排序