问题描述
我正在查看GeeksForGeeks上的Counting Sort的代码,并在算法的最后阶段中,将原始数组中的元素插入到其在排序数组中的最终位置(倒数第二个) for循环),则以相反的顺序遍历输入数组。
我似乎无法理解为什么您不能只从输入数组的开头到结尾,就像这样:
for i in range(len(arr)):
output_arr[count_arr[arr[i] - min_element] - 1] = arr[i]
count_arr[arr[i] - min_element] -= 1
是否存在一些我想念的相反原因的微妙原因?抱歉,这是一个非常明显的问题。我也看到了以相同的样式here实现的计数排序。
任何评论都会有所帮助,谢谢!
解决方法
Stability。用您的方式,等值元素的顺序会颠倒而不是保留。向后遍历输入将取消向后复制(-= 1
事物)。
要以向前顺序处理数组,count / index数组需要大一个元素,以便起始索引为0或可以使用两个局部变量。整数数组的示例:
def countSort(arr):
output = [0 for i in range(len(arr))]
count = [0 for i in range(257)] # change
for i in arr:
count[i+1] += 1 # change
for i in range(256):
count[i+1] += count[i] # change
for i in range(len(arr)):
output[count[arr[i]]] = arr[i] # change
count[arr[i]] += 1 # change
return output
arr = [4,3,1,7,2,6,5]
ans = countSort(arr)
print(ans)
或使用两个变量s保留运行总和,c保留当前计数:
def countSort(arr):
output = [0 for i in range(len(arr))]
count = [0 for i in range(256)]
for i in arr:
count[i] += 1
s = 0
for i in range(256):
c = count[i]
count[i] = s
s = s + c
for i in range(len(arr)):
output[count[arr[i]]] = arr[i]
count[arr[i]] += 1
return output
arr = [4,5]
ans = countSort(arr)
print(ans)