排序n个元素所需的(n-1)个比较数?

时间:2011-01-06 23:58:40

标签: algorithm math sorting

如果我有n个元素,请说

a, b, c

然后我可以使用与(n-1)个比较器的6个比较来对元素进行排序:

if (a > b && b > c) {
   a, b, c
}
else if (a < b && b < c) {
   c, b, a
}
else if (b > a && a > c) {
   b, a, c
}
else if (a > c && c > b) {
   a, c, b
}
else if (b > c && c > a) {
   b, c, a
}
else if (c > a && a > b) {
   c, a, b
}

现在我有两个问题:

  1. 这6次比较是否涵盖了3个元素的所有可能组合?

  2. 如果是,比较n个元素是否正确,n!需要与(n-1)个比较器进行比较?

3 个答案:

答案 0 :(得分:2)

是的,因为有n!排序n个元素的方法(排列)。其中一个是“正确的”方式,所以它是真的 - 至多是n! ....

(有更好的方法来排序n个元素数组,但使用你的方法,n!覆盖它)

答案 1 :(得分:2)

首先,是的,你已经涵盖了所有案例。但是,你拥有的并不是最佳的比较数。如果你被允许拥有更复杂的分支逻辑,那么你实际上可以通过更少的比较来逃避。考虑这一点的一种方法是你可以基本上在输入上运行排序算法,除了不是交换元素,你只需跟踪先前的比较如何进行,并使用它来影响你稍后进行的比较。使用这样的方法,您可以仅使用Θ(n lg n)比较进行排序(尽管您的源代码将包含Θ(n!)比较;您只是不会使用所有这些比较;)

答案 2 :(得分:1)

可以使用N log_2 N比较对N个整数的数组进行排序,这比N!小。这些比较很简单(只比较两个整数)。这是标准复杂性结果O(N log N)来自QuickSort和MergeSort的地方。它也被证明是最优的,即没有办法使用较少的比较来对数组进行排序。

因此,为了对N个整数进行排序,需要N log_2 N个比较,每个比较一个比较器。