(可能是)自创的下标排序法

今天学习算法中各类排序法,发现时间复杂度基本上都是O(n**2)
突发奇想到一个比较浪费空间但省时间的排序算法,其实也不知道意义何在,但记录一下博君一笑
代码如下:

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

#需要排序的a列表
alist = [433, 198, 389, 456, 216, 21, 133, 495, 262, 249, 208, 471, 402, 425, 156, 496, 245, 184, 299, 457]
max_num = alist[0]
# 创建一个不可能值,即需要排序的列表中不可能存在的值,用于初始化b列表
# 由于alist我是用randint生成的,所以暂且将该值设为0
IMPOSSABLENUM = 0
#储存最终结果的c列表
clist = []
# 取a列表中最大值max
for i in range(len(alist)):  # 时间复杂度n
    if max_num < alist[i]:
        max_num = alist[i]

# 生成max_num大小的空列表,和max_num大小的"重复"列表
blist = [IMPOSSABLENUM for i in range(max_num + 1)]
times = [0 for i in range(max_num + 1)]  # 用来记录某一个值的重复次数,个人认为还能优化,但太懒了

# 将a列表中的每个值放到b列表中,以该值为下标的位置,若重复则times列表记录重复次数
# 此时b列表中元素已完成排序,但还需精简和重复值的添加
for i in range(len(alist)):  # 时间复杂度n
    n = alist[i]
    if blist[n] == IMPOSSABLENUM:
        blist[n] = n
    else:
        times[n] += 1

# 将b列表中的有用数据按顺序放到c列表,并将重复值按照次数添加
for i in range(max_num + 1):  # 时间复杂度未知,假设为m
    if blist[i] != IMPOSSABLENUM:
        while times[i] >= 0:
            clist.append(blist[i])
            times[i] -= 1

print(clist)

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