我在GeeksForGeeks上查看了Counting Sort的代码,在算法的最后阶段,原始数组中的元素被插入到排序数组中的最终位置(循环倒数第二个(,输入数组按相反的顺序遍历。
我似乎不明白为什么你不能从输入数组的开始一直到结束,就像这样:
for i in range(len(arr)):
output_arr[count_arr[arr[i] - min_element] - 1] = arr[i]
count_arr[arr[i] - min_element] -= 1
有没有什么微妙的原因导致我错过了按相反的顺序走?如果这是一个非常明显的问题,请道歉。我在这里也看到了以相同风格实现的计数排序。
任何意见都会很有帮助,谢谢!
-= 1
(。
要按正向顺序处理数组,计数/索引数组需要大一个元素,以便起始索引为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,0,1,3,7,0,2,6,3,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,3,0,1,3,7,0,2,6,3,5]
ans = countSort(arr)
print(ans)
这里我们正在考虑稳定排序-->这实际上是逐位置地考虑元素。
例如,如果我们有类似的阵列
arr->5、8、3、1、1、2、6
0 1 2 3 4 5 6 7 8
计数->0 2 1 1 0 1 0 1
现在我们取所有频率的累积和
0 1 2 3 4 5 6 7 8
计数->0 2 3 4 5 6 6 7
遍历原始数组后,我们更喜欢从上一个开始我们想在元素的适当位置添加元素,所以当我们减去索引时,元素将添加到横向位置。
但是,如果我们从头开始遍历,那么取累积和就没有意义了,因为我们不是根据放置的元素进行加法。我们在冒险地添加hap,即使我们不取它们的累积总和,也可以做到。