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

问题描述

我正在查看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)