有沒有關於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. [object Null]&[object Undefined]是否尚未實現?
- 3. C++ string + =它是如何實現的?
- 4. 如何使用Arrays.sort
- 5. 爲什麼Arrays.sort採用Object []而不是Comparable []?
- 6. Linq如何實現它?
- 7. 如何將String.Concat(object,object)實現爲L2E框架?
- 8. 如何實現這個:object-> object-> property
- 9. Python A *實現
- 10. java String to a object
- 11. C相當於Java中的Arrays.sort - qsort? (我如何找到它的實現的本質)
- 12. 函數是Object的實例,Object是Function的實例?
- 13. Mass-add object如果它是一個類的實例
- 14. 什麼是Front Controller,它是如何在PHP中實現的?
- 15. 如何使用Prolog實現[a-z] [。?!] [] + [A-Z]的自動機?
- 16. 如何實現動態WHERE LIKE%A%B%
- 17. 如何實現.click()<a>標籤
- 18. FormsAuthentication類是如何實現的?如何看到它的來源?
- 19. OpenSSl + PHP如何實現它
- 20. RTMPS,如何實現它
- 21. 這是如何不實例化(新''')它:var a = Array.prototype.slice.call(arguments)?
- 22. 如何創建ArrayPredicate <A extends Object[]>?
- 23. 在Object子類和它自己的子類上實現ignoredProperties()
- 24. AS3中的A *(A-star)實現
- 25. A *實現問題
- 26. 如何使用Java Arrays.sort
- 27. AJAX是如何實現的?它如何幫助web開發?
- 28. 「public/protected/private」方法是如何實現的?如何模擬它?
- 29. [a - > a] - >(a - > a)的最慣用的實現`
- 30. A = A〜= 0是做什麼的,我該如何指定它?
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