计数排序

假设n个输入元素中每一个都是介于0到k之间的整数,此处k为某个整数。当k=O(n)时,计数排序的运行时间为O(n)。
对每一个数的元素x,确定出小于x的元素个数。有了这一信息就可以把x直接放到最终输出数组中的位置上。

from random import randint


def countingSort(alist, k):
    n = len(alist)
    b = [0 for i in range(n)]
    c = [0 for i in range(k + 1)]
    for i in alist:
        c[i] += 1
    for i in range(1, len(c)):
        c[i] = c[i - 1] + c[i]
    for i in alist:
        b[c[i] - 1] = i
        c[i] -= 1
    return b


if __name__ == '__main__':
    a = [randint(0, 100) for i in range(100)]
    print(countingSort(a, 100))

计数排序的核心原理就是统计每个数比列表其他数大的次数, 次数越多说明, 这个数越大, 反之, 大于的次数越少, 说明, 这个数就越小。

def sort(l):
    n = len(l)
    res = [None] * n
    # 首次循环遍历, 每个列表的数都统计
    for i in range(n):
        # p 表示 a[i] 大于列表其他数 的次数
        p = 0
        # q 表示 等于 a[i] 的次数
        q = 0
        # 二次循环遍历, 列表中的每个数都和首次循环的数比较
        for j in range(n):
            if l[i] > l[j]:
                p += 1
            elif l[i] == l[j]:
                q += 1
        for k in range(p, p + q):  # q表示 相等的次数,就表示, 从 P 开始索引后, 连续 q 次,都是同样的 数
            res[k] = l[i]
    return res


print(sort([5, 5, 3]))
posted @ 2018-11-08 10:57  桥前石头  阅读(129)  评论(0编辑  收藏  举报