【问题标题】:Recursive/Sorting an Array a specific way以特定方式递归/排序数组
【发布时间】:2015-06-12 18:45:42
【问题描述】:

要对数组进行递归排序,请找到数组中最大的元素并将其与最后一个元素交换。然后递归地对数组从开始到倒数第二个元素进行排序。编写并测试以这种方式对数组进行递归排序的方法。启动它,我认为我的代码完全是垃圾。递归对我来说没有多大意义,只需要帮助解决这个问题。我找到了如何定位数组中最高 int 的方法,只是很难找到递归来对它进行排序。

public class Sorting
{
    public static void main(String[] args) 
    {
        int[] array={5,1,8,3,4,7};
        int length = array.length;
        int max = -99999;
        int[] revArray= sortArray(array,length-1,max,length);  

        for(int i:revArray)
            System.out.print(i+" ");

    }

    public static int[] sortArray(int[] a,int j,int max,int length)
    {        

        if( j <= 0)   
        {    
            return a;  

        }

        if(max < a[j])
        {
            max = a[j];            
            return sortArray(a, j-1, max,length); 

        }  

         return a;
    }
}

【问题讨论】:

  • 如果您展示您的尝试,您更有可能在这里获得帮助。发布您的代码,即使您认为它完全是垃圾!
  • swap 在哪里?
  • 你可能想谷歌“递归冒泡排序”。
  • 我一直在尝试交换方法,但没有工作。不幸的是,冒泡排序不是教授想要的
  • 为什么不寻找成熟的递归排序算法,如 QuickSort 和 MergeSort?

标签: java arrays sorting recursion


【解决方案1】:

您在某种程度上是在正确的轨道上,但您的代码看起来确实有点像您在一些事情上在黑暗中拍摄。有时,将问题分解为子问题并孤立地解决每个问题会使整个事情变得不那么不堪重负......

查找数组中最大元素的索引

首先,您需要能够找出未排序数组(或在本例中为子数组)中的最大元素。由于数组未排序,因此您必须遍历其所有元素以找到最大值。因此,首先,您可以编写一个辅助方法,将数组作为输入,并返回最大元素的索引。为此,您需要跟踪最大元素的值及其索引。在伪代码中:

function indexOfLargestElement(array)
    index = -1
    max = -infinity
    for i = 0 to array.length do
        if array[i] > max then
            index = i
            max = array[i]
        end
    end
    return index
end

现在,这只解决了在完整数组中查找最大元素的问题。修改方法以获取结束索引,以便您可以准确指定要查看的数组的距离。这使您可以找到从第一个元素开始的任何范围内的最大元素。

交换元素

Java 不像其他一些语言那样具有交换功能,因此您需要一个临时变量来保存一个索引的值,同时将另一个索引的值写入它。然后您可以将临时变量的值写入另一个索引,两个元素将有效地交换。您还可以编写一个辅助方法来执行此操作 - 它将一个数组和两个要交换的索引作为输入。

放在一起

现在您有了编写递归排序方法的工具。不过,在您这样做之前,请考虑一下该算法为何有效。如果你找到数组中最大的元素并将其与数组的最后一个元素交换,这意味着你可以将排序问题减少一个元素。现在您只需找到子数组中从数组的第一个元素开始到倒数第二个元素结束的最大元素。然后将该元素与倒数第二个元素交换,到现在为止,您已将排序问题减少了两个元素。现在您只需找到子数组中从数组的第一个元素开始到倒数第三个元素结束的最大元素。那你换...

这基本上就是递归。简单的递归函数有一个基本情况(例如一个大小为 1 的数组)和一个归纳情况(一个大小为 n 的数组)。这个想法是部分解决归纳案例,因此您可以将其简化为另一个更小的归纳案例,并继续这样做直到您达到基本案例,这通常是微不足道的(大小为 1 的数组已经排序)。

【讨论】:

    【解决方案2】:

    Andreas Troelsen 写了一封真正的 good answer 来说明您如何解决问题。

    这是代码,下面简要介绍它的工作原理:

    public class Sorting {
    
    public static void main (String[] args) { 
        int[] array = {5,1,8,3,4,7};
        sortArray(array, 0, array.length-1);
        printArray(array);
    }
    
    public static void sortArray(int[] array, int start, int end) {
        if ( start == end ) return;
        int max_index = findMax(array, start, end);
        swap(array, max_index, end);
        sortArray(array, start, end-1);
    }
    
    public static void swap(int[] array, int a, int b) {
        int temp = array[a];
        array[a] = array[b];
        array[b] = temp;
    }
    
    public static void printArray(int[] array) {
        for (int x : array)
            System.out.print(x + " ");
        System.out.println();
    }
    
    public static int findMax(int[] array, int start, int end) {
        int max = array[start];
        int index = start;
        for( ; start <= end; start++)
            if ( max < array[start] ) {
                max = array[start];
                index = start;
            }
        return index;
    }
    

    }

    给您一个数组,并希望按照您在问题中描述的方式对其进行排序。

    sortArray 方法执行以下操作:

    1. 查找具有最大值的元素的索引。这是通过 findMax 方法完成的。
    2. 将该元素与数组的最后一个元素交换。
    3. 递归调用自身以获取相同的数组,但不包含其最后一个元素(最大且已正确排序)。

    【讨论】:

    • omg 非常感谢,我只是想不通如何初始化数组中的最终变量,然后取一个数组等等。
    • @Consultion 我很高兴能帮上忙。我注册只是为了回答这个问题;但希望它不会是唯一的:D
    猜你喜欢
    • 2020-03-13
    • 2014-11-20
    • 2021-06-26
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多