计数排序

我听说了计数排序,并根据我的理解写了它的版本.

public void my_counting_sort(int[] arr)
    {
        int range = 100;
        int[] count = new int[range];
        for (int i = 0; i < arr.Length; i++) count[arr[i]]++;
        int index = 0;
        for (int i = 0; i < count.Length; i++)
        {
            while (count[i] != 0)
            {
                arr[index++] = i;
                count[i]--;
            }
        }
    }

上面的代码运行完美.

但是,CLRS中给出的算法是不同的.下面是我的实现

public int[] counting_sort(int[] arr)
    {
        int k = 100;
        int[] count = new int[k + 1];
        for (int i = 0; i < arr.Length; i++)
            count[arr[i]]++;
        for (int i = 1; i <= k; i++)
            count[i] = count[i] + count[i - 1];
        int[] b = new int[arr.Length];
        for (int i = arr.Length - 1; i >= 0; i--)
        {
            b[count[arr[i]]] = arr[i];
            count[arr[i]]--;
        }
        return b;
    }

我已经将其直接从伪代码转换为C#.该代码无法正常工作,并且出现IndexOutOfRange异常.

所以我的问题是:

>第二段代码有什么问题?
>我的幼稚实现与书中给出的算法之间有什么区别?

解决方法:

您的版本存在的问题是,如果元素具有卫星数据,它将无法正常工作.

CLRS版本可以使用并且很稳定.

编辑:

这是Python中CLRS版本的实现,该实现按键对(键,值)进行排序:

def sort(a):
  B = 101
  count = [0] * B
  for (k, v) in a:
    count[k] += 1
  for i in range(1, B):
    count[i] += count[i-1]
  b = [None] * len(a)
  for i in range(len(a) - 1, -1, -1):
    (k, v) = a[i]
    count[k] -= 1
    b[count[k]] = a[i]
  return b    


>>> print sort([(3,'b'),(2,'a'),(3,'l'),(1,'s'),(1,'t'),(3,'e')])
[(1, 's'), (1, 't'), (2, 'a'), (3, 'b'), (3, 'l'), (3, 'e')]
上一篇:在一组数据上使用Java不同的排序方法


下一篇:sql-Android-如何对列表进行排序