我正在尝试使用递归算法进行插入排序,但它不能包含任何类型的迭代循环。 这是我写的代码;它似乎无法运作
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--;
}
答案 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
时,递归解决问题并不是他们想到的第一件事。一个常见的惯例是使用非大写字母启动方法名称。