簡體   English   中英

Java MergeSort算法遞歸

[英]Java MergeSort Algorithm recursive

我有一個小問題。 我嘗試實現遞歸的合並排序算法。

int sort_list[] = {5, 9, 7, 8, 3, 4, 5, 6, 1, 0};
int[] left = new int[sort_list.length];
int[] right = new int[sort_list.length];

public Mergesort() {
    int[] lv_sorted_list = mergeSort(sort_list);
    for (int i = 0; i < lv_sorted_list.length; i++) {
        System.out.print(" " + lv_sorted_list[i] + ", ");
    }
}

int[] mergeSort(int[] iv_sort_list) {

   for (int i = 0; i < iv_sort_list.length; i++) {
       System.out.print("Divide: " + iv_sort_list[i] + " ");
    }
    System.out.println("");

    if (iv_sort_list.length > 1) {
        left = mergeSort(Arrays.copyOfRange(iv_sort_list, 0, iv_sort_list.length / 2)); 
        right = mergeSort(Arrays.copyOfRange(iv_sort_list, iv_sort_list.length / 2, iv_sort_list.length)); 
    } 
    int i = 0;
    int j = 0;
    int[] sorted_list = new int[left.length + right.length];
    while (i < left.length && j < right.length) {
        if (left[i] > right[j]) {
            int tmp = left[i];
            left[i] = right[j];
            right[j] = tmp;
            System.arraycopy(left, 0, sorted_list, 0, left.length);
            System.arraycopy(right, 0, sorted_list, left.length, right.length);
            i++;
            j++;
        }else{
            break;
        }
    return sorted_list;
}

現在我的問題:

left = mergeSort(Arrays.copyOfRange(iv_sort_list, 0, iv_sort_list.length)); right = mergeSort(Arrays.copyOfRange(iv_sort_list, iv_sort_list.length, iv_sort_list.length));

如果我嘗試分配左/右數組“ mergeSort(...)”,那么它將僅分配一個具有新長度的新數組,該數組在每個位置都包含值0。

非常感謝您的幫助 :)

我認為您在遞歸函數中缺少基本情況iv_sort_list.length = 1iv_sort_list.length = 2 (取決於您的實現)。

您的left[]right[]應該在每個遞歸調用中聲明嗎? 由於您使用了很多length屬性,因此如果將其聲明為具有固定長度的global會出錯。

另外,您的合並代碼似乎有些混亂,我做了一些修改,現在它應該可以工作,請在此處查看示例: 合並排序(Java)演示

暫無
暫無

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

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