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

Algorithm 排序n个元素所需的(n-1)比较数?,algorithm,math,sorting,Algorithm,Math,Sorting,如果我有n个元素,比如 a, b, c 然后我可以使用6个比较(n-1)比较器对元素进行排序: 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) {

如果我有n个元素,比如

a, b, c
然后我可以使用6个比较(n-1)比较器对元素进行排序:

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
}
if(a>b&&b>c){
a、 b,c
}
否则如果(aa&&a>c){
b、 a,c
}
否则如果(a>c&&c>b){
a、 c、b
}
否则如果(b>c&&c>a){
b、 c,a
}
否则如果(c>a&&a>b){
c、 a,b
}
现在我有两个问题:

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

  • 如果是,比较n个元素,n!是否需要与(n-1)比较器进行比较


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


    (有更好的方法对n个元素数组进行排序,但使用您的方法,n!将其覆盖)

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


    (有更好的方法对n个元素数组进行排序,但是使用您的方法,n!覆盖它)

    对于初学者,是的,您已经覆盖了所有情况。然而,您所拥有的并不是最佳的比较数量。如果允许您使用更复杂的分支逻辑,那么您实际上可以进行更少的比较。考虑这一点的一种方法是,基本上可以对输入运行排序算法,除了不交换元素之外,您只需跟踪之前的比较过程,并使用它来影响以后的比较。使用这样的方法,您可以只使用Θ(n lg n!)比较总数进行排序(尽管您的源代码将包含Θ(n!)比较;您只是不会使用所有比较。)

    对于初学者,是的,您已经涵盖了所有情况。然而,您所拥有的并不是最佳的比较数量。如果允许您使用更复杂的分支逻辑,那么您实际上可以进行更少的比较。考虑这一点的一种方法是,基本上可以对输入运行排序算法,除了不交换元素之外,您只需跟踪之前的比较过程,并使用它来影响以后的比较。使用这样的方法,您可以只使用Θ(n lg n)比较总数进行排序(尽管您的源代码将包含Θ(n!)比较;您只是不会使用所有比较。)

    可以使用n个log_2 n比较对n个整数数组进行排序,这远远小于n!。这些比较很简单(仅比较两个整数)。这就是快速排序和合并排序的标准复杂性结果O(N log N)的来源。它也被证明是最优的,也就是说,不可能使用比这更少的比较来对数组进行排序


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

    可以使用N个log_2 N比较对N个整数数组进行排序,这比N!小得多!。这些比较很简单(仅比较两个整数)。这就是快速排序和合并排序的标准复杂性结果O(N log N)的来源。它也被证明是最优的,也就是说,不可能使用比这更少的比较来对数组进行排序


    因此,为了对N个整数进行排序,您需要N个log\u 2 N个比较,每个比较中有一个比较器。

    最好的排序算法是N*log(N)。最好的排序算法是N*log(N)。如果源代码包含的比较数超过θ(1),您就有麻烦了。:-)嗯,是的。。。通常情况下,您会使用数组对所有内容进行编码,然后使用变量对其进行索引,因此您基本上是在压缩表示。如果扩展所有分支,则可能会进行θ(n!)比较。如果源代码包含的比较超过θ(1),则会遇到麻烦。:-)嗯,是的。。。通常情况下,您会使用数组对所有内容进行编码,然后使用变量对其进行索引,因此您基本上是在压缩表示。如果你扩展了所有的分支,你会得到θ(n!)可能的比较结果。每次比较后你会得到1位信息,所以
    2^number\u比较结果必须是>=
    n。在这个例子中,他计算了6个比较-这个问题的比较是1个等式,而不是比较运算符。我只是指问题的“世界”。当然,这并不是解决这项任务的方法。每次比较后,您都会得到1位信息,因此
    2^number\u比较必须是>=
    n。在这个例子中,他计算了6个比较-这个问题的比较是1个等式,而不是比较运算符。我只是指问题的“世界”。当然,这不是解决这项任务的办法。