Java程序跳过for循环

Java程序跳过for循环,java,arrays,loops,for-loop,skip,Java,Arrays,Loops,For Loop,Skip,这个程序的要点是使用递归将一个大数组分解为四个独立的数组,直到每个数组包含小于或等于1000个整数。发生错误时,将对数组进行排序,然后将其添加到ArrayList中 我的问题是,在声明了四个子数组之后,我的程序完全跳过for循环集,直接进入递归调用,这导致我的数组只填充了零。我不知道为什么会发生这种情况,因此任何见解都将不胜感激 public static void quadSort(int[] array, int startIndex, int endIndex) {

这个程序的要点是使用递归将一个大数组分解为四个独立的数组,直到每个数组包含小于或等于1000个整数。发生错误时,将对数组进行排序,然后将其添加到ArrayList中

我的问题是,在声明了四个子数组之后,我的程序完全跳过for循环集,直接进入递归调用,这导致我的数组只填充了零。我不知道为什么会发生这种情况,因此任何见解都将不胜感激

 public static void quadSort(int[] array, int startIndex, int endIndex) {
            // Insertion sort
            if(endIndex - startIndex <= 1000) {
                for(int i = 0; i <= endIndex; i++) {
                    int x = array[i];
                    int j = i;
                    while(j > 0 && array[j - 1] > x) {
                        array[j] = array[j - 1];
                        j = j - 1;
                    }
                    array[j] = x;
                }

                for(int i = 0; i < array.length; i++) {
                    list.add(array[i]);
                }
            }

            else {

                // Split array into four separate arrays
                int[] a = new int[(endIndex + 1) / 4];
                int[] b = new int[(endIndex + 1) / 4];
                int[] c = new int[(endIndex + 1) / 4];
                int[] d = new int[(endIndex + 1) / 4];

                // Fill separate arrays with initial array's values
                for(int i = 0; i < (endIndex + 1) * (1/4); i++) {

                    for(int k = startIndex; k < (endIndex + 1) * (1/4); k++) {
                        a[i] = array[k];
                    }

                    for(int l = (endIndex + 1) * (1/4); l < (endIndex + 1) * (1/2); l++) {
                        b[i] = array[l];
                    }

                    for(int m = (endIndex + 1) * (1/2); m < (endIndex + 1) * (3/4); m++) {
                        c[i] = array[m];
                    }

                    for(int n = (endIndex + 1) * (1/4); n < endIndex + 1; n++) {
                        d[i] = array[n];
                    }
                }

                quadSort(a,0,a.length - 1);
                quadSort(b,0,b.length - 1);
                quadSort(c,0,c.length - 1);
                quadSort(d,0,d.length - 1);
            }
        }
publicstaticvoidquadsort(int[]数组、int-startIndex、int-endIndex){
//插入排序
if(结束索引-开始索引x){
数组[j]=数组[j-1];
j=j-1;
}
数组[j]=x;
}
for(int i=0;i
问题在于
1/4
的计算结果为零(它是一个整数除法,因此分数被丢弃)。你可以通过将不平等的两边乘以4来解决这个问题,如下所示:

for(int i = 0 ; 4*i < (endIndex + 1) ; i++)
    ...
for(int i=0;4*i<(endIndex+1);i++)
...
现在,条件在逻辑上是等价的*,但它的计算不使用除法


*假设没有溢出,问题是
1/4
的计算结果为零(它是一个整数除法,因此分数被丢弃)。你可以通过将不平等的两边乘以4来解决这个问题,如下所示:

for(int i = 0 ; 4*i < (endIndex + 1) ; i++)
    ...
for(int i = 0; i < (endIndex + 1) * (1/4); i++) 
for(int i=0;4*i<(endIndex+1);i++)
...
现在,条件在逻辑上是等价的*,但它的计算不使用除法

*假设(inti=0;i<(endIndex+1)*(1/4);i++)没有溢出
for(int i = 0; i < (endIndex + 1) * (1/4); i++) 
由于整数除法,将迭代0次

for(int i=0;i<(endIndex+1)*(1/4);i++)

由于整数除法,将迭代0次

这是整数算术的一种情况

如果运行此命令:

 System.out.println(1/4);
您将获得
0

另一方面,这:

System.out.println(1.0f/4.0f);
给出
0.25


使用该选项,可以将循环更改为如下所示:

for(int i = 0; i < (endIndex + 1) * (1.0f/4.0f); i++)
for(int i=0;i<(endIndex+1)*(1.0f/4.0f);i++)
或者,您可以跳过除法,改用预先计算的值:

for(int i = 0; i < (endIndex + 1) * .25f; i++)
for(int i=0;i<(endIndex+1)*.25f;i++)

这是一个整数算术的例子

如果运行此命令:

 System.out.println(1/4);
您将获得
0

另一方面,这:

System.out.println(1.0f/4.0f);
给出
0.25


使用该选项,可以将循环更改为如下所示:

for(int i = 0; i < (endIndex + 1) * (1.0f/4.0f); i++)
for(int i=0;i<(endIndex+1)*(1.0f/4.0f);i++)
或者,您可以跳过除法,改用预先计算的值:

for(int i = 0; i < (endIndex + 1) * .25f; i++)
for(int i=0;i<(endIndex+1)*.25f;i++)

您应该了解Java的
整数算术
。例如,
1/2
1/4
的计算结果为零。哦,这是真的。我觉得自己像个白痴。我使用它将数组填充到原始数组的四分之一大小。有没有关于实现相同目标的不同表示法的想法?for循环也会导致所有子数组元素都相同。请详细说明您的目标。我有int n={endIndex+1)*(3/4)让for循环从列表的第三个四分之一开始。如果不使用除法,我将如何表示相同的内容?您应该了解Java的
整数算术
。例如,
1/2
1/4
的计算结果为零。哦,是的。我觉得自己像个白痴。我用它来填充数组,使其大小达到原始ar的四分之一ray。有没有关于实现相同目标的不同表示法的想法?for循环也会导致所有子数组元素都相同。请详细说明您的目标。我有int n={endIndex+1)*(3/4)让for循环从列表的第三季度开始。如果不使用除法,我将如何表达相同的内容?噢,非常感谢。噢,非常感谢。