亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合并排序算法問題

合并排序算法問題

炎炎設計 2022-12-15 17:00:59
MergeSorting 算法不工作。繼續得到一個IndexOutOFBoundsError。我相信問題可能是因為沒有哨兵。leftarray當andrightarray將自身復制到時,我需要創建一個循環k,其中一個數組用完了數字,這會導致錯誤。我需要一些幫助來創建這個哨兵。private static <T> void mergeSort(Comparable<? extends T>[] items, int begIndx, int endIndx) {    if (items.length > 1) {        int midIndx = items.length / 2;        @SuppressWarnings("unchecked")        T[] left = (T[]) new Object[midIndx];        @SuppressWarnings("unchecked")        T[] right = (T[]) new Object[items.length - midIndx];        for (int i = 0; i < midIndx; i++) {            left[i] = (T) items[i];        }        for (int i = midIndx; i < items.length; i++) {            right[i] = (T) items[i];        }        mergeSort(items, begIndx, midIndx);        mergeSort(items, midIndx + 1, 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 + 1;    int sizeOfRight = endIndx - midIndx;    /// change to generic later    @SuppressWarnings("unchecked")    T[] leftArr = (T[]) new Object[sizeOfLeft + 1];    @SuppressWarnings("unchecked")    T[] rightArr = (T[]) new Object[sizeOfRight + 1];    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 + 1];    }    int i = 0;    int j = 0;    // changed to less than or equal to rather than "less than"    // this is because this is a zero based index system    // and because endeIndex is not a length but an index,    // you need to populate it.    for (int k = begIndx; k <= endIndx; k++) {        // use comparable here        if (((Integer) leftArr[i]).compareTo((Integer) rightArr[j]) <= 0) {            array[k] = (Comparable<? extends T>) leftArr[i];            i = i + 1;        }         }    }}我創建了一個整數數組arr = new Integer[5]。所以應該對這 5 個數字進行排序。
查看完整描述

1 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

您的代碼中存在多個問題:

  • 目前尚不清楚該指數endIndx是被包括還是被排除在外。如果排除了 ,代碼會簡單得多endIndx,對數組進行排序的初始調用很簡單:mergesort(arr, 0, arr.length);

  • 中的初始測試mergesort不正確:您應該測試切片是否有超過 1 個元素,而不是測試數組長度:

    if (endIndx - begIndx > 1)
  • 數組leftright未在mergesort.

  • left不需要在數組和rightin中分配額外的元素,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++;

    }

}


查看完整回答
反對 回復 2022-12-15
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號