桶排序

桶排序假设数据服从均匀分布,平均情况下它的代价为O(n)

桶排序假定输入是由一个随机过程产生,该过程将元素均匀、独立分布在[0,1)区间上 将[0,1)区间划分成n个相同大小的子区间,称为桶。然后将n个输入数分别放入桶中 然后循环n个桶,对每个桶排序,采用插入排序算法

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from math import floor

def insertSort(seq):
    for j in range(1, len(seq)):
        key = seq[j]
        # insert arrays[j] into the sorted seq[0...j-1]
        i = j - 1
        while i >= 0 and seq[i] > key:
            seq[i + 1] = seq[i]
            i -= 1
        seq[i + 1] = key


def bucketSort(A):
    n = len(A)
    B = [[] for i in range(n)]
    for i in range(0, n):
        ind = int(floor(n * A[i]))
        B[ind].append(A[i])

    for i in range(0, n):
        insertSort(B[i])

    res = []

    for i in range(0, n):
        res.extend(B[i])
    A[:] = res[:]


if __name__ == '__main__':
    AA = [9, 15, 17, 10, 16, 3, 14, 12, 1, 4]
    BB = [i / 20.0 for i in AA]
    print(BB)
    bucketSort(BB)
    print(BB)