Java - 使10个整数排序程序递归

时间:2014-02-21 02:48:35

标签: java arrays recursion arraylist

我有一个简单的问题 - 我需要订购10个号码。我知道如何递归地执行此操作:创建10个数字的数组,取10个数字中的最大数字,将其从数组中取出,并使用剩下的9个数字重复相同的函数。问题是我不知道如何实现它。我编写了程序,并且它有效,只有它有一个部分,一直重复但有新的数组,因为你不能改变数组的大小。

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        int[] sortedArray = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

        Scanner input = new Scanner(System.in);
        int in0 = input.nextInt();
        int in1 = input.nextInt();
        int in2 = input.nextInt();
        int in3 = input.nextInt();
        int in4 = input.nextInt();
        int in5 = input.nextInt();
        int in6 = input.nextInt();
        int in7 = input.nextInt();
        int in8 = input.nextInt();
        int in9 = input.nextInt();

        int[] numArray = new int[]{in0, in1, in2, in3, in4, in5, in6, in7, in8, in9};

        int numArrayLength = numArray.length;
        recursiveSort(numArray);
        for (int i=0;i<numArrayLength;i++) {
            System.out.print(numArray[i]+",");
        }
        sortedArray[0] = numArray[0];
        System.out.println(" ");

        int[] numArray2 = Arrays.copyOfRange(numArray, 1, numArrayLength);
        int numArray2Length = numArray2.length;
        recursiveSort(numArray2);
        for (int j=0;j<numArray2Length;j++) {
            System.out.print(numArray2[j]+",");
        }
        sortedArray[1] = numArray2[0];
        System.out.println(" ");

        int[] numArray3 = Arrays.copyOfRange(numArray2, 1, numArray2Length);
        int numArray3Length = numArray3.length;
        recursiveSort(numArray3);
        for (int k=0;k<numArray3Length;k++) {
            System.out.print(numArray3[k]+",");
        }
        sortedArray[2] = numArray3[0];
        System.out.println(" ");

        int[] numArray4 = Arrays.copyOfRange(numArray3, 1, numArray3Length);
        int numArray4Length = numArray4.length;
        recursiveSort(numArray4);
        for (int k=0;k<numArray4Length;k++) {
            System.out.print(numArray4[k]+",");
        }
        sortedArray[3] = numArray4[0];
        System.out.println(" ");

        int[] numArray5 = Arrays.copyOfRange(numArray4, 1, numArray4Length);
        int numArray5Length = numArray5.length;
        recursiveSort(numArray5);
        for (int k=0;k<numArray5Length;k++) {
            System.out.print(numArray5[k]+",");
        }
        sortedArray[4] = numArray5[0];
        System.out.println(" ");

        int[] numArray6 = Arrays.copyOfRange(numArray5, 1, numArray5Length);
        int numArray6Length = numArray6.length;
        recursiveSort(numArray6);
        for (int k=0;k<numArray6Length;k++) {
            System.out.print(numArray6[k]+",");
        }
        sortedArray[5] = numArray6[0];
        System.out.println(" ");

        int[] numArray7 = Arrays.copyOfRange(numArray6, 1, numArray6Length);
        int numArray7Length = numArray7.length;
        recursiveSort(numArray7);
        for (int k=0;k<numArray7Length;k++) {
            System.out.print(numArray7[k]+",");
        }
        sortedArray[6] = numArray7[0];
        System.out.println(" ");

        int[] numArray8 = Arrays.copyOfRange(numArray7, 1, numArray7Length);
        int numArray8Length = numArray8.length;
        recursiveSort(numArray8);
        for (int k=0;k<numArray8Length;k++) {
            System.out.print(numArray8[k]+",");
        }
        sortedArray[7] = numArray8[0];
        System.out.println(" ");

        int[] numArray9 = Arrays.copyOfRange(numArray8, 1, numArray8Length);
        int numArray9Length = numArray9.length;
        recursiveSort(numArray9);
        for (int k=0;k<numArray9Length;k++) {
            System.out.print(numArray9[k]+",");
        }
        sortedArray[8] = numArray9[0];
        System.out.println(" ");

        int[] numArray10 = Arrays.copyOfRange(numArray9, 1, numArray9Length);
        int numArray10Length = numArray10.length;
        recursiveSort(numArray10);
        for (int k=0;k<numArray10Length;k++) {
            System.out.print(numArray10[k]+",");
        }
        sortedArray[9] = numArray10[0];
        System.out.println(" ");

        sortedArray[2] = numArray3[0];
        for (int dasdasd=0;dasdasd<sortedArray.length;dasdasd++) {
            System.out.print(sortedArray[dasdasd]+",");
        }
    }
    private static int[] recursiveSort(int numArray[]) {
        int numArrayLength = numArray.length;
        int maximum = 0;
        for (int i=0;i<numArrayLength;i++) {
            if (numArray[i] > maximum) {
                maximum = numArray[i];
            }
        }

        int indexOfMaximum = -1;

        for (int j=0;j<numArrayLength;j++) {
            if (numArray[j] == maximum) {
                indexOfMaximum = j;
                break;
            }
        }

        int temporary = numArray[0];
        numArray[0] = numArray[indexOfMaximum];
        numArray[indexOfMaximum] = temporary;
        return numArray;
    }
}

如您所见,

int[] numArray(n) = Arrays.copyOfRange(numArray(n-1), 1, numArray(n-1)Length);
int numArray(n)Length = numArray(n).length;
recursiveSort(numArray(n));
for (int k=0;k<numArray(n)Length;k++) {
    System.out.print(numArray(n)[k]+",");
}
sortedArray[(n-1)] = numArray(n)[0];
System.out.println(" ");

不断重复,所以可能会有一个很好的递归解决方案。也许我可以使用ArrayLists做一些事情,因为它们的大小可以改变......

任何帮助将不胜感激! 谢谢!

4 个答案:

答案 0 :(得分:1)

我建议使用一个递归例程,该例程对要保留的部分使用显式启动索引:

private static void recursiveSort(int[] array, int start) {
    if (start < array.length - 1) {
        int maximum = array[start];
        int maximumIndex = start;
        for (int i = start + 1; i < array.length; ++i) {
            if (array[i] > maximum) {
                maximum = array[i];
                maximumIndex = i;
            }
        }
        if (maximumIndex != start) {
            int tmp = array[start];
            array[start] = array[maximumIndex];
            array[maximumIndex] = tmp;
        }
        recursiveSort(array, start + 1);
    }
}

这实际上是递归(与你的代码不同,它代码调用一个名为&#34的例程; recursiveSort&#34;但根本不是递归的)。整个过程将通过调用:

开始
recursiveSort(numArray, 0);

返回时,数组将按降序排序。

作为一般启发式方法,当您在如何使方法递归时遇到困难时,您应该考虑在方法中添加参数以帮助进行簿记。

答案 1 :(得分:1)

这是家庭作业还是你需要订购号码?如果您使用ArrayList()而不是array[],Java可以轻松地执行此操作。您只需要致电Collections.sort(yourArrayList);

答案 2 :(得分:1)

我建议不要尝试制作自己的排序算法。许多聪明人已经为你做了那么辛苦的工作。

你试图实现的“递归”排序(也就是Ted告诉你如何真正做出递归的冒泡排序)会起作用,但效率非常低。查看排序算法here的比较。

下面是您尝试实现的算法的演示,与shell排序相比,它是可用的最快排序算法之一。我使用的实现取自here。运行它,你会发现shell排序平均比冒泡排序快7到8倍。

public class SortingDemo {
    // Methods required for Shell sort
    public static void shellSort(Comparable[] a) {
        int N = a.length;
        int h = 1;
        while (h < N/3) h = 3*h + 1;

        while (h >= 1) {
            for (int i = h; i < N; i++) {
                for (int j = i; j >= h && less(a[j], a[j-h]); j -= h) {
                    exch(a, j, j-h);
                }
            }
            assert isHsorted(a, h); 
            h /= 3;
        }
        assert isSorted(a);
    }

    private static boolean less(Comparable v, Comparable w) {
        return (v.compareTo(w) < 0);
    }

    private static void exch(Object[] a, int i, int j) {
        Object swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }

    private static boolean isSorted(Comparable[] a) {
        for (int i = 1; i < a.length; i++)
            if (less(a[i], a[i-1])) return false;
        return true;
    }

    private static boolean isHsorted(Comparable[] a, int h) {
        for (int i = h; i < a.length; i++)
            if (less(a[i], a[i-h])) return false;
        return true;
    }

    // Method required for "recursive" sort
    private static void recursiveSort(Integer[] array, int start) {
        if (start < array.length - 1) {
            int maximum = array[start];
            int maximumIndex = start;
            for (int i = start + 1; i < array.length; ++i) {
                if (array[i] > maximum) {
                    maximum = array[i];
                    maximumIndex = i;
                }
            }
            if (maximumIndex != start) {
                int tmp = array[start];
                array[start] = array[maximumIndex];
                array[maximumIndex] = tmp;
            }
            recursiveSort(array, start + 1);
        }
    }

    public static void main(String[] args) {
        int desiredArraySize = 1000;
        int minSizeOfNumberInArray = 0;
        int maxSizeOfNumberInArray = 100;
        Integer[] array = new Integer[desiredArraySize]; // Used Integer instead of int to utilize Comparable interface
        for(int i = 0; i < array.length; i++) {
            int randomInt = (int) Math.random() * (maxSizeOfNumberInArray - minSizeOfNumberInArray);
            array[i] = randomInt;
        }

        long startTime = System.nanoTime();
        recursiveSort(array, 0);
        long endTime = System.nanoTime();
        long recursiveSortTime = endTime - startTime;
        System.out.println(String.format("\"Recursive\" sort completed in %d ns", recursiveSortTime));

        startTime = System.nanoTime();
        shellSort(array);
        endTime = System.nanoTime();
        long shellSortTime = endTime - startTime;
        System.out.println(String.format("Shell sort completed in %d ns", shellSortTime));

        System.out.println(String.format("\"Recursive\" sort took %f times longer", (float)recursiveSortTime / (float)shellSortTime));
    }
}

答案 3 :(得分:1)

在学习编程时,编写自己的排序算法和自己的递归算法都是很好的练习,可以巩固你对事物运作方式的理解。现在投入的时间很长,即使有人已经做得更好了。

您注意到一种重复的模式,并将其与递归相关联。在评估递归是否合适时,我鼓励你用“分而治之”的概念来调整思维过程。如果每次递归只解决一个元素,那么堆栈会变得非常深,应该避免。如果你可以将问题分成大致均匀的块并递归处理每个块,那么递归将是一个很好的选择。否则,循环已经非常适合重复模式。