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

递归合并排序不返回已排序数组

戎元忠
2023-03-14

我写了3个方法来实现递归合并排序,参数数量有限(没有aux、lo、mid、hi)。我认为我的工作是这样的,但它并没有返回一个排序数组,尽管它在运行时没有任何编译错误。我已经摆弄了4个小时,似乎无法弄清楚我做错了什么,没有合并一个有序数组。我只从我的助教那里得到了非常模糊的输入,并且能够修复我正在遇到的一些问题,但是该方法仍然没有对项数组进行排序。欢迎任何关于我在这里做错了什么的建议。谢谢!

    public static void sort(Comparable[] a) {
        //Sort a recursively
        a = mergeSort(a);

    }
    
    
    /** 
     * 
     * Method recursively splits array into halves until length becomes 1, then
     * Calls merge to merge the split arrays back together.
     * @param a Comparable[] 
     * @return a Comparable[]
     */
    public static Comparable[] mergeSort(Comparable[] a) {
        if (a.length <= 1) {
            return a;
        }
        else {
        //create 1st array for D&C, length = 1/2 a.length
        Comparable[] first = new Comparable[a.length / 2]; 
        
        //create 2nd array for D&C, length = a.length - first.length
        Comparable[] second = new Comparable[a.length - first.length]; 
        
      //source/position: a[0], destination/position: first[0], length: first.length
        System.arraycopy(a, 0, first, 0, first.length);      
        
      //source/position: a[first.length], destination/pos: second[0], length: second.length
        System.arraycopy(a, first.length, second, 0, second.length);  
        
        //recursively sort the first half
        first = mergeSort(first);
        
        //recursively sort second half
        second =  mergeSort(second);
        
        //merge the halves
        a= merge(first,second);
        }
        
        //return the merged array
        return a;
    }
    
    public static Comparable[] merge(Comparable[] a, Comparable[] b) {
        Comparable[] result = new Comparable[a.length + b.length];
        
            //Index Position in first array - starting with first element
            int first = 0;
             
            //Index Position in second array - starting with first element
            int second = 0;
             
            //Index Position in merged array - starting with first position
            int merged = 0;
             
            //Compare first and second, 

            while (first < a.length && second < b.length) 
            {
                if (a[first].compareTo(b[second]) < 0) 
                {
                    result[merged++] = a[first++];
  
                } 
                else
                {
                    result[merged++] = b[second++];
             
                }
             
            }
            
            //Store remaining elements of 1st array
            while(first < a.length) {
                result[merged++] = a[first++];
            }
            
            //Store remaining elements of second array
            while(second < b.length) {
                result[merged++] = b[second++];
            }
            
            //copy elements from both halves - each half will have the sorted elements
           // System.arraycopy(a, first, result, merged, a.length - first);
           // System.arraycopy(b, second, result, merged, b.length - second);
            
            return result;
        }
    

共有1个答案

陆卓
2023-03-14

正如@Thomas所指出的,Java函数是按值传递的。因此,执行a=mergeSort(a)不会更改原始数组,而是对传递给function的数组的副本进行排序。相反,您可以返回结果:

public static Comperable[] sort(Comparable[] a) {
        //Sort a recursively
        return mergeSort(a);
}

这将用本地值计算所有东西,并将其归还给原始“所有者”。

 类似资料:
  • 我试图实现一个递归合并排序算法来排序一个简单的整数数组,但我得到奇怪的值为索引在我的数组的后半部分。前半部分似乎排序精细,这是令人困惑的,因为它是递归实现的。随机整数数组在我的main方法中初始化。 } 这会产生以下输出: 未排序数组={15,9,12,19,49,43,57,70,78,87}对于第1轮:第一个=0中间=4最后=9第1轮中的数组={15,9、12,19、49,43、57,70、7

  • 我有个小问题。我尝试实现合并排序算法递归。 现在我的问题: 左=合并排序(rrays.copyOfRange(iv_sort_list,0,iv_sort_list.length));右=合并排序(rrays.copyOfRange(iv_sort_list,iv_sort_list.length,iv_sort_list.length)); 如果我尝试分配我的左/右数组“mergeSort(..

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

  • 我正在尝试理解递归排序函数,它是mergesort算法的一部分。下面是我的代码,我几乎可以肯定它是正确的(通过在线课程)。 我理解合并的作用——它将每个子数组分解成两个较小的子数组,重复这个过程,直到子数组的长度为1(根据定义排序),然后合并。然而,这个排序函数用来完成这个任务的实际方法对我来说很难理解。也许是因为我不习惯递归函数,但是我想知道是否有人可以在第一次合并发生时阐明操作的顺序和参数是什

  • 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法); 自下而上的迭代; 在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但

  • 快速排序 from typing import List def quick_sort(arr: List, left, right) -> List: """ 快速排序是对冒泡排序的改进,核心思想是找到一个中值点pivot,然后将小于等于pivot的放在pivot的左边,大于pivot的放在右边,一直递归到无法拆分pivot点。 :param arr: :re