对于如果存在使用两个数组成员进行比较的操作,该方法会导致排序算法的时间复杂度会存在一个下界问题,该问题在使用计数排序的时候可以突破这个理论下界,也即是不适用元素比对的操作的算法之一,计数排序。
添加图片注释,不超过 140 字(可选)
对于以上给定数组进行计数排序的基本流程,首先遍历一次数组,获得数组中元素的最大值,给定的数组的最大值为6,于是创建含有7个元素的新数组,其中每个元素的初始值是0。
添加图片注释,不超过 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