如果在 Java 中没有子包的概念,有什么办法可以解决这个问题呢?我有一些只对测试人员和包中的其他成员可用的方法。我应该把所有东西都放在同一个包裹里吗?使用广泛的反射?
游行。首先是一个定义,因为它非常重要: 稳定型保证不会用相同的键重新排序元素。
建议:
合并排序: 当您需要一个稳定的 O (N log N)排序时,这是您唯一的选择。它唯一的缺点是使用 O (N)辅助空间,并且常数比快速排序稍大。有一些就地合并排序,但 AFAIK 他们都不稳定或比 O (N 日志 N)更差。即使 O (N log N)适当排序的常数也比普通的合并排序的常数大得多,因此它们更多的是理论上的好奇心,而不是有用的算法。
快速排序: 当您不需要稳定的排序时,平均情况下的性能比最差情况下的性能更重要。快速排序的平均值是 O (N logN) ,最坏的情况是 O (N ^ 2)。一个好的实现是使用 O (log N)辅助存储,以堆栈空间的形式进行递归。
合并排序: 当您需要一个稳定的 O (N log N)排序时,这是您唯一的选择。它唯一的缺点是使用 O (N)辅助空间,并且常数比快速排序稍大。有一些就地合并排序,但 AFAIK 他们都不稳定或比 O (N 日志 N)更差。即使 O (N log N)适当排序的常数也比普通的合并排序的常数大得多,因此它们更多的是理论上的好奇心,而不是有用的算法。
堆排序: 当您不需要稳定的排序并且更关心最差情况下的性能而不是平均情况下的性能时。它肯定是 O (N log N) ,并使用 O (1)辅助空间,这意味着在非常大的输入上不会意外地用完堆或堆栈空间。
堆排序: 当您不需要稳定的排序并且更关心最差情况下的性能而不是平均情况下的性能时。它肯定是 O (N log N) ,并使用 O (1)辅助空间,这意味着在非常大的输入上不会意外地用完堆或堆栈空间。
内向排序: 这是一种快速排序,在一定的递归深度之后切换到堆排序,以避免快速排序的 O (N ^ 2)最坏情况。它几乎总是优于普通的老式快速排序,因为您得到了快速排序的平均情况,并保证了 O (N log N)性能。使用堆排序而不使用堆排序的唯一原因可能是在内存严重受限的系统中,其中 O (log N)堆栈空间实际上非常重要。
内向排序: 这是一种快速排序,在一定的递归深度之后切换到堆排序,以避免快速排序的 O (N ^ 2)最坏情况。它几乎总是优于普通的老式快速排序,因为您得到了快速排序的平均情况,并保证了 O (N log N)性能。使用堆排序而不使用堆排序的唯一原因可能是在内存严重受限的系统中,其中 O (log N)堆栈空间实际上非常重要。
插入 sort : 当 N 保证很小时,包括作为快速排序或合并排序的基本情况。当这是 O (N ^ 2)时,它有一个很小的常数,是一个稳定的排序。
插入 sort : 当 N 保证很小时,包括作为快速排序或合并排序的基本情况。当这是 O (N ^ 2)时,它有一个很小的常数,是一个稳定的排序。
气泡排序,选择排序 : 当你正在做一些又快又脏的事情时,由于某些原因,你不能仅仅使用标准库的排序算法。与插入排序相比,它们的唯一优点是实现起来稍微容易一些。
气泡排序,选择排序 : 当你正在做一些又快又脏的事情时,由于某些原因,你不能仅仅使用标准库的排序算法。与插入排序相比,它们的唯一优点是实现起来稍微容易一些。
非比较排序: 在一些相当有限的条件下,可以突破 O (N logN)壁垒,在 O (N)中进行排序。下面是一些值得一试的案例:
非比较排序: 在一些相当有限的条件下,可以突破 O (N logN)壁垒,在 O (N)中进行排序。下面是一些值得一试的案例:
计数排序: 当对范围有限的整数进行排序时。
计数排序: 当对范围有限的整数进行排序时。
基数排序: 当 log (N)显著大于 K 时,其中 K 是基数位数。
基数排序: 当 log (N)显著大于 K 时,其中 K 是基数位数。
Bucket sort: 当您可以保证您的输入是近似均匀分布的时候。