当前位置: 首页 > 知识库问答 >
问题:

Java合并排序递归算法

孟韬
2023-03-14

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

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;
}

现在我的问题:

左=合并排序(rrays.copyOfRange(iv_sort_list,0,iv_sort_list.length));右=合并排序(rrays.copyOfRange(iv_sort_list,iv_sort_list.length,iv_sort_list.length));

如果我尝试分配我的左/右数组“mergeSort(...)”,那么它将仅分配一个具有新长度的新数组,该数组在每个位置都包含值0。

非常感谢您的帮助:)

共有1个答案

郭远
2023-03-14

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

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

另外,您的合并代码似乎有点凌乱,我已经修改了一些,现在应该可以工作了,请参见这里的示例:合并排序(Java)演示

 类似资料:
  • 我在我的应用程序中有以下合并排序代码。我对递归方法在不满足if条件时从if块中出来后如何再次调用感到非常困惑。 我调试了我的代码,但我仍然没有得到它。调用mergesort(0,号-1)的排序方法首先从mergesort(0,5)开始。低小于高,中间是2,所以接下来运行mergesort(0,2)。这一直持续到我们有mergesort(0,0),在这种情况下,低不小于高,所以它来自if块。但是当我

  • 本文向大家介绍C#递归算法之归并排序,包括了C#递归算法之归并排序的使用技巧和注意事项,需要的朋友参考一下 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,

  • 我正在尝试编写一个ruby方法,它可以递归地执行合并排序。我有这个方法,但这是一次我偶然得到它的工作,所以我不知道它为什么工作,并很想了解我写的代码是如何工作的。在psuedocode中,我遵循的步骤如下所示。 拆分长度为n的原始数组,直到我拥有长度为1的n个数组 一次合并和排序长度为m的2个数组,以返回长度为m*2的数组 重复上述步骤,直到我有一个长度为n的当前排序数组 基本上,在我看来,这是一

  • 主要内容:归并排序算法的具体实现归并排序算法是在 分治算法基础上设计出来的一种排序算法,它可以对指定序列完成升序(由小到大)或降序(由大到小)排序,对应的时间复杂度为 。 归并排序算法实现排序的思路是: 将整个待排序序列划分成多个不可再分的子序列,每个子序列中仅有 1 个元素; 所有的子序列进行两两合并,合并过程中完成排序操作,最终合并得到的新序列就是有序序列。 举个简单的例子,使用归并排序算法对 {7, 5, 2, 4, 1,

  • 本文向大家介绍java实现归并排序算法,包括了java实现归并排序算法的使用技巧和注意事项,需要的朋友参考一下 归并排序算法思想: 分而治之(divide - conquer);每个递归过程涉及三个步骤 第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素. 第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作 第三, 合并: 合

  • 本文向大家介绍浅析java 归并排序算法,包括了浅析java 归并排序算法的使用技巧和注意事项,需要的朋友参考一下 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型