排序小整数数组的最佳排序算法是什么?

时间:2011-09-29 09:04:53

标签: java arrays algorithm sorting

根据问题标题,如果数组的长度为奇数,则数组元素的编号为1 - 10.

示例,

  

3 6 8 1 3 7 7 9 4 1

我在考虑使用 heapsort ?由于它是一个数组,合并排序插入排序需要转移,并且不会那么高效。

8 个答案:

答案 0 :(得分:32)

  

数组元素的数字为1 - 10.

有了这个限制,counting sort将比任何通用排序算法更有效 - 它是O(n)

答案 1 :(得分:6)

这是我的计数排序示例

static int[] countingSort(int[] numbers) {
    int max = numbers[0];
    for (int i = 1; i < numbers.length; i++) {
        if (numbers[i] > max)
            max = numbers[i];
    }

    int[] sortedNumbers = new int[max+1];

    for (int i = 0; i < numbers.length; i++) {
        sortedNumbers[numbers[i]]++;
    }

    int insertPosition = 0;

    for (int i = 0; i <= max; i++) {
            for (int j = 0; j < sortedNumbers[i]; j++) {
                    numbers[insertPosition] = i;
                    insertPosition++;
            }
    }
    return numbers;
}

答案 2 :(得分:3)

如果只有10个元素,那么即使担心它也不值得。如果有一百万,它可能会开始变得重要。

答案 3 :(得分:2)

编辑:计算排序可能是最佳的,因为元素的范围仅为1-10。应用于此问题的计数排序将在O(n)时间内运行。合并排序(我在下面推荐)的运行时间不会超过O(nlogn)时间。并行计数排序可能很有趣。只需为每个处理器分配一个带有n / p元素的子阵列。每个处理器都有自己的大小为9的计数数组。这一步应该花费O(n / p)时间。然后将所有计数数组合并为一个数组,这应该花费O(p)时间。我没有完全考虑计数排序的最后一步,元素按顺序放置,但似乎只要count数组的元素是原子的,你可以将原始数组的n / p部分分配给个体处理器并实现一些并行化。然而,计数数组的各个元素会存在争用,可能会大大降低并发性。您可能能够将计数数组的子部分分配给p个处理器,并且如果元素分布相当均匀,则返回O(n / p)运行时,但是您将限制为10个处理器。如果元素不均匀分布,则一个或多个处理器可以执行更大比例的工作。这是一个很好的问题;你可以在O(n / p)时间进行计数排序吗?

Quicksort是一种出色的就地排序算法,运行速度快,可以节省内存。但是,如果元素的范围仅为1-10,那么如果要对大量元素进行排序,则最终会在最初或在排序期间的中间时间运行相同数量的大量运行。有序数组或子数组实际上可能会降低Quicksort的性能。

如果你不关心记忆,一个简单的Mergesort就足够了。 Mergesort采用最快的标准排序算法。

Java 7中的默认Collections.sort()实现是一种改编自'TimSort'的Mergesort算法。 Java 7中的默认Arrays.sort()实现是双枢轴Quicksort。

如果你想并行,并行Quicksort可以在具有少量处理器的大型阵列上获得良好的结果,但具有与顺序Quicksort相同的限制。 PSRS可以帮助扩展到更多的处理器。

答案 4 :(得分:1)

您应该考虑查看复杂性图表Complexity Comparison Chart

排序算法的比较基于时间和空间复杂度的最佳,平均,最差情况。基于此图表,您可以看到Counting Sort方法在空间和时间复杂性方面最佳。其他可比较的方法是Radix Sort。

最糟糕的[时间,空间]复杂度&#34;计数排序&#34; : - [O(n + k),O(k)]。

最糟糕的[时间,空间]复杂度&#34; Radix Sort&#34; : - [O(nk),O(n + k)]。

答案 5 :(得分:0)

在这种情况下,计数排序将是最佳选择。

假设数据是整数,范围为0-k。创建一个大小为K的数组,以跟踪显示的项目数(3个值为0的项目,4个值为1的项目等)。鉴于此计数,您可以告诉项目的位置 - 所有1必须在0之后,其中有3个。因此,1从项目#4开始。因此,我们可以扫描物品并将它们插入正确的位置。

创建计数数组是O(N) 将物品插入正确的位置是O(N) 我在这里过于简单 - 有一个计数的总和,以及一个最大到最小的排序,使排序保持稳定。

答案 6 :(得分:0)

QuickSort是分而治之算法。它选择一个元素作为枢轴,并围绕拾取的枢轴对给定数组进行分区,然后重复该过程。 quickSort有许多不同的版本,它们以不同的方式选择枢轴

答案 7 :(得分:-1)

这是简单排序(插入排序)

的示例
private static void insertionSort(int[] a) {

    // [230, 23, 45, 34, 98]
    for (int j = 2; j < a.length; j++) {

        int key = a[j];
        int i = j - 1;

        while (i > 0 && a[i] > key) {
            a[i + 1] = a[i];
            i--;
        }
        a[i + 1] = key;
    }

    System.out.println("sorted array: " + Arrays.toString(a));
}