有没有关于Arrays.sort(Object [] a)使用的mergeSort的实现方式?虽然它被证明是相当不错的,但我很难理解它(特别是为什么src和dest在mergeSort()get递归调用时被切换)。Arrays.sort(Object [] a) - 它是如何实现的?
回答
Here is the source的java.util.Arrays
。
实际上,您在JDK中拥有该源代码 - 只需在您的IDE中打开java.util.Arrays
,并且会显示源代码+注释。如果你没有IDE,看看JDK_HOME\src.zip
然后,把它放在你的IDE中,并跟踪它的工作原理。
- 放断点(和调试模式运行程序)
- 使用它
System.out.println(..)
- 改变部分看看它们是如何体现。
- 阅读wikipedia article about merge sort
- 要注意此评论:
// Recursively sort halves of dest into src
它出现** OP已经看到了源码(因为他/她提到了'src'和'dest'数组在递归调用时被切换的事实),但很难理解逻辑。 – 2010-02-07 20:13:03
嗯,是的。我给出了一些关于如何更好地理解它的指导。 – Bozho 2010-02-07 20:15:20
当然,我可能是错的......无论如何,我会建议OP使用* poor-man的调试器*(在算法中放置一些System.out.println),但是你却击败了我! – 2010-02-07 20:18:19
我曾经有过与你同样的困惑。根据我的理解,这种切换的原因很简单 - 使后续合并步骤更容易。没有魔法。
private static void mergeSortWithoutSwitch(Object[] src, Object[] dest, int low, int high, int off) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i = low; i < high; i++)
for (int j = i; j > low && ((Comparable) dest[j - 1]).compareTo(dest[j]) > 0; j--)
swap(dest, j, j - 1);
return;
}
// Recursively sort halves of dest into src
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
mergeSortWithoutSwitch(src, dest, low, mid, off);
mergeSortWithoutSwitch(src, dest, mid, high, off);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (((Comparable) dest[mid - 1]).compareTo(dest[mid]) <= 0) {
return;
}
// Merge sorted halves (now in src) into dest
for (int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && ((Comparable) dest[p]).compareTo(dest[q]) <= 0)
src[i] = dest[p++];
else
src[i] = dest[q++];
}
// copy back
for (int i = destLow; i < destHigh; i++) {
dest[i] = src[i];
}
}
上面是没有切换的实现,从代码中可以看到我们需要多一步合并 - 复制回来。我认为mergeSort中的参数命名有点困惑,因为src是只用于合并步骤的辅助数组,所以最好用aux命名(我们甚至可以将它从方法签名中移除,并创建一个局部变量合并时)。 dest是结果数组。
- 1. 如何使用Arrays.sort
- 2. Linq如何实现它?
- 3. 如何将String.Concat(object,object)实现为L2E框架?
- 4. 如何实现这个:object-> object-> property
- 5. C相当于Java中的Arrays.sort - qsort? (我如何找到它的实现的本质)
- 6. 函数是Object的实例,Object是Function的实例?
- 7. 如何实现动态WHERE LIKE%A%B%
- 8. 如何使用Java Arrays.sort
- 9. OpenSSl + PHP如何实现它
- 10. FormsAuthentication类是如何实现的?如何看到它的来源?
- 11. 如何创建ArrayPredicate <A extends Object[]>?
- 12. 这是如何不实例化(新''')它:var a = Array.prototype.slice.call(arguments)?
- 13. AS3中的A *(A-star)实现
- 14. “public/protected/private”方法是如何实现的?如何模拟它?
- 15. AJAX是如何实现的?它如何帮助web开发?
- 16. directx 9 mouse over a object
- 17. A *实现缓慢的Python
- 18. 调用此UI行为是什么?它是如何实现的?
- 19. ng-content是一个组件吗?它是如何实现的?
- 20. 如何实现'ex :: Maybe [[也许a]] - > [[a]]'方法
- 21. '[object Object]'而不是实际数组
- 22. 模拟主机无法访问 - 如何实现/实现它
- 23. 如何实现修改“JPA entitiy-object结构”的参数变体?
- 24. 性能使用Arrays.sort
- 25. pthread_join是如何实现的?
- 26. UITableViewCellSelectionStyleGray是如何实现的?
- 27. HttpSession是如何实现的?
- 28. Spree.config是如何实现的?
- 29. nth_element是如何实现的?
- 30. pandas.json.dumps是如何实现的?
http://www.docjar.com/html/api/java/util/Arrays.java.html这里的源代码 – Bozho 2010-02-07 19:49:09
Bozho,你应该已经发布了一个答案! – Will 2010-02-07 19:57:03
看起来真正的工作从486行开始。 – MatrixFrog 2010-02-07 19:58:21