【问题标题】:Insertion sort using recursive algorithm in Java (no loops)在 Java 中使用递归算法进行插入排序(无循环)
【发布时间】:2018-05-09 21:43:44
【问题描述】:

我正在尝试使用递归算法进行插入排序,但它不能包含任何类型的迭代循环。 这是我写的代码;它似乎不起作用

class Sort {
    public int shift(int[] a, int j, int k){
        if(j>=0 && k< a[j]){
            a[j + 1] = a[j];
            j--;
            shift(a,j, k);
        }
        return j;
    }

    public void IS(int a[], int i){
        int j, temp;
        if(i<a.length){
            j = i-1;
            temp = a[i];
            a[shift(a,j,temp)+1]=temp;
            IS(a,i+1);
        }
    }    
}

IS() 中的i 从 1 开始。 我对我的 shift() 方法感到困惑。如果使用下面的代码,那么它可以工作。我正在尝试将 while 循环转换为递归算法,但我总是得到错误的输出。

while (j >= 0 && temp<data[j]) {
  a[j + 1] = a[j];
  j--;
}

【问题讨论】:

标签: java sorting recursion


【解决方案1】:

我假设你像这样开始你的递归(例如):

    int[] values = new int[] {7, 9, 1, 8, 2};
    IS(values, 0);

如果您打印输出,您会看到您的解决方案正在达到解决方案,但还没有完全解决。此示例的输出:7, 1, 8, 2, 9。实际上,唯一发生的事情是9 向右移动了几次。

需要更多的转变。您可以通过多次调用IS 来做到这一点。从性能的角度来看,这非常难看,但它确实有效:

public void metaIS(int[] a, int i) {
    IS(a, 0);
    if (i < a.length) {
        metaIS(a, i + 1);
    }
}

也就是说,如果数组长度为 5 个数字,则调用 IS 5 次,一切正常:1, 2, 7, 8, 9

顺便说一下,重命名方法可能是个好主意。当人们听到IS 时,递归问题解决并不是他们首先想到的。一个常见的约定是方法名称以非大写开头。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多