线性时间排序

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

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


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


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

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

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

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

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


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

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


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

基数排序,一言以蔽之:就是从低到高依次对每个关键字进行基数排序,结果就得到有序序列。这里用到了计数排序的稳定性。




你可能感兴趣的:(算法)