为什么Java impl选择合并排序而不是快速排序?为什么他们要将内容复制到数组中?
接口:“排序算法是一种改进的合并排序算法(如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。该实现将指定的列表转储到一个数组中,对该数组进行排序,并遍历该列表,从该数组中的相应位置重新设置每个元素。这避免了尝试对链表进行原地排序所导致的n2 log(n)性能。”
发布于 2010-08-01 15:07:35
Java专家在最坏的情况下使用了avg,正如您可能知道的那样,在最坏的情况下,快速排序可能会运行O(n^2)。
您可以读入API,就地对链表进行排序更加复杂n^2log(n)
合并排序是稳定的,这对于快速排序的有效版本是不正确的。(这在对对象进行排序时非常重要,因为许多程序员在使用Collections.sort()时认为这是理所当然的)
发布于 2010-08-01 15:47:10
我认为选择mergesort的主要原因是因为它很稳定。
其他人提到的n log n最坏情况保证是一个优势,但它可能不是主要原因。如果查看Arrays.sort方法,就会发现原语上的所有排序都使用quicksort,而Object[]上的排序使用mergesort。这是因为稳定的排序对于基元来说并不重要;相等的基元彼此之间不能区分。
发布于 2010-08-01 15:09:33
https://stackoverflow.com/questions/3381108
复制相似问题