根据问题标题,如果数组的长度为奇数,则数组元素的编号为1 - 10.
示例,
3 6 8 1 3 7 7 9 4 1
我在考虑使用 heapsort ?由于它是一个数组,合并排序和插入排序需要转移,并且不会那么高效。
答案 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));
}