簡體   English   中英

排序通用類型的數組

[英]Sorting An Array of Generic Type

我正在嘗試對遺傳類型數組實施合並排序算法。 問題是由於某些元素設置為0,結果是不正確的。我懷疑問題是由於我在整個程序中進行的強制轉換引起的,但我不知道確切的原因。

如您在sortUsingMerge()中所見,我將Object的數組轉換為泛型。 同樣在下面的IF語句中,我將數組中的Object元素強制轉換為int以便能夠比較2個元素。 我的意圖是排序算法應該適用於任何類型的任何數組,但是我現在暫時不想為每種類型編寫比較器。

Input array: 5 1 -2 3 7 8 0
Output: -2 0 1 1 3 7 0

看起來數字5和8在排序過程中以某種方式轉換為不同的數字。 有人可以告訴我為什么嗎? 謝謝!

Source code:

public void sortUsingMerge(){
    Object[] array = (E[]) new Object[size];
    Object[] helper = (E[]) new Object[size];

    mergeSort(array,helper,0,size-1);

}
 public void mergeSort(Object[] array, Object[] helper, int low, int high){

       if (low<high){ 

            int mid = (low + high)/2;

            mergeSort(array,helper,low,mid); //sort left half
            mergeSort(array,helper,mid+1,high);//sort right half
            merge(array,helper,low,mid,high);

        }
}
public void merge(Object[] array, Object[] helper, int low, int mid, int high){

    for (int i=low; i<=high; i++){// copy both parts into helper array
        helper[i] = array[i];
    }

    int helperLeft = low;
    int helperRight = mid + 1;
    int current = low;

    while (helperLeft <= mid && helperRight <=high){

        if ((int)helper[helperLeft] <= (int)helper[helperRight]){
            array[current] = helper[helperLeft];
            helperLeft++;
        }
        else{
            array[current] = helper[helperRight];
            helperRight++;
        }

        current++;
    }


    int remain = mid - helperLeft;
    for (int i=0; i<remain; i++){
        array[current+i] = helper[helperLeft + i];
    }


}

內部合並替換

    for (int i=0; i<remain; i++){
     array[current+i] = helper[helperLeft + i];
    }

    while (helperLeft <= mid) {
        array[current] = helper[helperLeft];
        current++;
        helperLeft++;
    }

強制轉換永遠不會給您這種錯誤。 合並結束時出現錯誤。

    int remain = mid - helperLeft;
    for (int i=0; i <= remain; i++) {                 //changed < to <=
        array[current+i] = helper[helperLeft + i];
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM