【问题标题】:Fastest way to sort 3 values in Java [closed]在Java中对3个值进行排序的最快方法[关闭]
【发布时间】:2016-11-03 02:54:00
【问题描述】:

我必须按正确的顺序输入 3 个值并将它们打印到控制台。

一种解决方案是将它们放入一个数组中,然后对其进行排序,但我记得(从学校时代起)比较和排序它们的速度更快,但是我找不到正确的比较顺序。

您能否告诉我如何将 3 个值与if 语句的最少数量进行比较?

【问题讨论】:

标签: java sorting


【解决方案1】:

冒泡排序在最坏的情况下只有 3 个比较操作和 6 个分配(如果与这种情况下的插入排序的行为不同,它将非常相似):

if (a > b)
   swap(a,b)
if (b > c)
   swap(b,c)
if (a > b)
   swap(a,b)
print a,b,c

不能在少于 3 次比较中完成,因为数组有 n!=6 可能的排列,而 ceil(log_2(n!)) = 3

【讨论】:

  • @TravisJ 虽然 big-O 公式是正确的,但事实是具有合理冒泡排序实现的 3 元素的最坏情况是 3 比较和 2 交换,而不是 @ 987654327@ 的任何东西。 big-O 表示法是对通常更复杂、更难以确定运算次数的精确公式的一种极大简化。这种简化的代价是允许在不同程度上高估。
  • @millimoose:swap() 中没有比较 - 仅读取和分配,使其进行 3 次比较。我的解决方案旨在展示一个具有最少 COMPARES 数量(“最低树”)的算法,并表明它不能通过较少的比较来完成。
  • @TravisJ:请再次阅读大 O 符号的定义,我将其详细说明为对您答案的评论。在谈论小规模时 - 大 O 什么都不说,因为上限定义不包括这些情况(来自大 O 的定义)。
  • @TravisJ 嗯,讨论包含太多的cmets,因此被删除,我只想添加底线,希望它被接受。大 O 表示法表示:如果 f(x)O(g(x)) - 那么有 x0,M 使得对于每个 x > x0:|f(x)| &lt; M*g(x)。如果 x f(x) = { if x < 10: x^10 | otherwise: x }。根据大 O 的定义,我们将得到 f(x)O(x)。就是说-我要睡觉了,明天有工作。非常欢迎您打开聊天室,如果您愿意学习,我会在明天尝试详细说明。
  • "它不能在少于 3 次比较内完成" 是的,它可以。考虑a &lt;= b &lt;= ca &gt; b &gt; c。它不能在少于 2 次比较中完成。
【解决方案2】:

优化这个没有意义。它不会获得任何速度。 3 的 O(n!) 仍然只有 3*2 = 6 次操作。甚至 O(2^n) 也将是 8。您真的可以尽一切努力对这 3 个值进行排序,而不会看到性能差异。

编辑

int a, b, c, min, max, med;//assume values are there for a b c
if( a > b ){
 if( a > c ){
  max = a;
  if( b > c ){
   med = b;
   min = c;
  }else{
   med = c;
   min = b;
  }
 }else{
  med = a;
  max = c;
  min = b;
 }
}else{
 if( b > c ){
  max = b;
  if( a > c ){
   med = a;
   min = c;
  }else{
   med = c;
   min = a;
  }
 }else{
  med = b;
  max = c;
  min = a;
 }
}

【讨论】:

  • 下面的代码似乎没有必要:if( b &gt; c ){ max = b; min = c; }else{因为一旦a大于b,但a不大于c,那么b永远不会大于c。
  • @durban - 没错,这主要是为了表明明确检查所有场景不会影响如此小的操作的速度。我删除了多余的代码。
【解决方案3】:

据我所知,Java 使用 Quicksort 算法进行排序 - 一种已经优化的方法。这里没有收获的速度!

【讨论】:

  • 专门针对边界情况(例如仅对 3 个值进行排序)。像快速排序这样的常规排序算法可能表现不佳
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 2012-03-29
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多