以特定方式递归/排序数组

时间:2015-04-08 00:46:54

标签: java arrays sorting recursion

要递归排序数组,找到数组中最大的元素并将其与最后一个元素交换。然后递归地将数组从开始排序到倒数第二个元素。编写并测试以这种方式递归排序数组的方法。启动它,我认为我的代码完全垃圾。递归对我来说没有多大意义,只需要帮助解决这个问题。我已经找到了如何在数组中找到最高的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;
    }
}

2 个答案:

答案 0 :(得分: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没有像其他一些语言那样具有交换功能,所以当你将另一个索引的值写入其中时,你需要一个临时变量来保存一个索引的值。然后,您可以将临时变量的值写入另一个索引,这两个元素将被有效地交换。您还可以编写一个辅助方法来执行此操作 - 它将数组作为输入,并将两个索引作为交换。

将它们放在一起

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

这基本上就是递归。简单的递归函数具有基本情况(例如,大小为1的数组)和归纳情况(大小为n的数组)。这个想法是部分地解决感应案例,所以你可以将它减少到另一个更小的感应案例,并继续这样做,直到你到达基本情况,这通常是微不足道的(1号阵列已经是排序)。

答案 1 :(得分:0)

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. 以相同的数组递归调用自身,但没有最后一个元素(最大且已经正确排序)。