使用Java中的递归算法进行插入排序(无循环)

时间:2017-11-26 15:14:05

标签: java sorting recursion

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

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--;
}

1 个答案:

答案 0 :(得分:0)

我假设您开始递归(例如):

    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时,递归解决问题并不是他们想到的第一件事。一个常见的惯例是使用非大写字母启动方法名称。