Python实现计数排序

对于如果存在使用两个数组成员进行比较的操作,该方法会导致排序算法的时间复杂度会存在一个下界问题,该问题在使用计数排序的时候可以突破这个理论下界,也即是不适用元素比对的操作的算法之一,计数排序。

添加图片注释,不超过 140 字(可选)

对于以上给定数组进行计数排序的基本流程,首先遍历一次数组,获得数组中元素的最大值,给定的数组的最大值为6,于是创建含有7个元素的新数组,其中每个元素的初始值是0。

Python实现计数排序_第1张图片

添加图片注释,不超过 140 字(可选)

这个元素所对应的就是根据原数组最大值所创建的新数组,这个数组包含元素的个数正好等于要排序数组中的最大值,这个数组称为bufferArray,接着遍历原始数组的元素,然后取出对应的元素值。就把这个元素值当做下标,将bufferArray中对应的下表的元素值加1,这样操作后,bufferArray元素值变化如下:

添加图片注释,不超过 140 字(可选)

继续这样的操作之后,下一次遍历的元素值是0,把bufferArray下标为0的元素值加1,然后下一个遍历的元素是1,一直继续,得到最后的bufferArray的数组状态是:

添加图片注释,不超过 140 字(可选)

接下来就是将bufferArray中的元素前后相加,执行后的bufferArray元素是:

添加图片注释,不超过 140 字(可选)

使用python实现计数排序的代码如下:

def  counting_sort(A):
    k = 0
    for element in A:
        if isinstance(element int) is False or element < 0:  #计数排序要求每个元素必须是整数且大于0
            raise Exception(\element has to be integer and no minus\)
        if element > k:
            k = element
    buffer_array = []
    for i in range(0 k + 1): #根据最大值元素创建新数组,并初始化为0
        buffer_array.append(0)
    for element in A: #遍历数组每个元素在数组buffer_array中进行计数
        buffer_array[element] += 1
    for i in range(1 len(buffer_array)): #将buffer_array中的元素前后相加
        buffer_array[i] = buffer_array[i - 1] + buffer_array[i]  
    sorted_array = []
    for i in range(0 len(A)):  #构建与数组A元素个数相同的新数组
        sorted_array.append(0)
    A = A[::-1]
    for element in A:  #根据buffer_array中对元素的计数在新数组中排序
        position = buffer_array[element]
        sorted_array[position - 1] = element
        buffer_array[element] -= 1
    return sorted_array

你可能感兴趣的:(python,算法,数据结构)