计数排序-为什么在插入过程中按相反的顺序进行



我在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,即使我们不取它们的累积总和,也可以做到。

相关内容

  • 没有找到相关文章

最新更新