1 回答

TA貢獻1877條經驗 獲得超6個贊
您的代碼中存在多個問題:
目前尚不清楚該指數
endIndx
是被包括還是被排除在外。如果排除了 ,代碼會簡單得多endIndx
,對數組進行排序的初始調用很簡單:mergesort(arr, 0, arr.length);
中的初始測試
mergesort
不正確:您應該測試切片是否有超過 1 個元素,而不是測試數組長度:if (endIndx - begIndx > 1)
數組
left
和right
未在mergesort
.left
不需要在數組和right
in中分配額外的元素,merge
將數組索引值與子數組的長度進行比較要簡單得多。這種哨兵方法令人困惑,不應使用。
這是一個簡化版本:
private static <T> void mergeSort(Comparable<? extends T>[] items, int begIndx, int endIndx) {
if (endIndx - begIndx > 1) {
int midIndx = items.length / 2;
mergeSort(items, begIndx, midIndx);
mergeSort(items, midIndx, endIndx);
merge(items, begIndx, midIndx, endIndx);
}
}
@SuppressWarnings("unchecked")
private static <T> void merge(Comparable<? extends T>[] array,
int begIndx, int midIndx, int endIndx) {
int sizeOfLeft = midIndx - begIndx;
int sizeOfRight = endIndx - midIndx;
/// change to generic later
@SuppressWarnings("unchecked")
T[] leftArr = (T[]) new Object[sizeOfLeft];
@SuppressWarnings("unchecked")
T[] rightArr = (T[]) new Object[sizeOfRight];
for (int i = 0; i < sizeOfLeft; i++) {
leftArr[i] = (T)array[begIndx + i];
}
for (int j = 0; j < sizeOfRight; j++) {
rightArr[j] = (T)array[midIndx + j];
}
int i = 0;
int j = 0;
int k = begIndx;
while (i < sizeOfLeft && j < sizeOfRight) {
/// use comparable to compare actual values
if ((Integer)leftArr[i]).compareTo((Integer)rightArr[j]) <= 0) {
array[k] = (Comparable<? extends T>)leftArr[i];
i++;
k++;
} else {
array[k] = (Comparable<? extends T>)rightArr[j];
j++;
k++;
}
}
while (i < sizeOfLeft) {
array[k] = (Comparable<? extends T>)leftArr[i];
i++;
k++;
}
while (j < sizeOfRight) {
array[k] = (Comparable<? extends T>)rightArr[j];
j++;
k++;
}
}
添加回答
舉報