这种O(n)排序方法是否已经存在?

时间:2017-12-21 16:18:50

标签: java arrays sorting

我们的想法是在最终数组中将所有值设置为其父索引,然后删除所有空值。 这是一些简单的实现:

int x[] = {9,3,4,2,1,12,5};
sortList(x)

public static int[] sortList(int[] x){
    int[] y = new int[15];
    for (int i=0; i < x.length; i++){
        int value = x[i];
        y[value] = value;
    }
    return removeNull(y);
}
public static int[] removeNull(int[] array) {
    return Arrays.stream(array).filter(i -> i != 0).toArray();
}

注意,它只对唯一的非零值进行排序。这是该方法在通过数组时所做的事情:

数组 - &gt; 9,3,4,2,1,5将被转换为 - &gt; 0,1,2,3,4,5,0,0,0,9,0,0然后到 - &gt; 1,2,3,4,5,9 如果我是正确的,这个解决方案将循环通过数组3次,并采取y大小作为它的存储。这种排序方法是否已存在?

1 个答案:

答案 0 :(得分:1)

此算法称为Counting Sort

这里有维基百科的描述:

  

在计算机科学中,计数排序是一种根据小整数键对对象集合进行排序的算法;也就是说,它是一个整数排序算法。它通过计算具有每个不同键值的对象的数量来操作,并对这些计数使用算术来确定输出序列中每个键值的位置。它的运行时间与项目数量以及最大和最小键值之间的差异是线性的,因此它仅适用于键的变化不大于项目数的情况下的直接使用。

正如您所指出的,您的算法会丢弃重复项。计数排序因其解决此问题的方法而得名:计算每个键的项数。这种算法确实是线性的,但时间和空间中的高常数因子意味着它在实践中很少使用。