【问题标题】:Java MergeSort Algorithm recursiveJava MergeSort 算法递归
【发布时间】:2016-03-17 14:56:50
【问题描述】:

我有一个小问题。 我尝试递归实现归并排序算法。

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。

非常感谢您的帮助:)

【问题讨论】:

    标签: java arrays algorithm recursion


    【解决方案1】:

    我认为您在递归函数中缺少基本情况 iv_sort_list.length = 1iv_sort_list.length = 2(取决于您的实现)。

    您的left[]right[] 应该在每个递归调用中声明吗?由于您经常使用 length 属性,如果您声明为具有固定长度的全局变量,则会出错。

    你的合并代码看起来有点乱,我修改了一下,现在应该可以了,请看这里的例子:Merge Sort (Java) demo

    【讨论】:

    • 非常感谢您的帮助和您的演示 :) 我会尝试理解它并自己实现它
    • @Reptain 没问题,如果需要更多帮助请告诉我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多