Java 数组越界
这个程序的目的是找到数组中的第k个最小元素,而不使用递归和非递归的降序和降序方法对数组进行排序 我希望有人可以查看我的代码,并尝试帮助我处理数组越界错误 抛出这些错误的方法是递归选择,非递归选择工作正常 我的驱动程序也是附加的,如果你想测试我的代码,一切都应该编译Java 数组越界,java,arrays,exception,indexing,Java,Arrays,Exception,Indexing,这个程序的目的是找到数组中的第k个最小元素,而不使用递归和非递归的降序和降序方法对数组进行排序 我希望有人可以查看我的代码,并尝试帮助我处理数组越界错误 抛出这些错误的方法是递归选择,非递归选择工作正常 我的驱动程序也是附加的,如果你想测试我的代码,一切都应该编译 public class KthSmallest { private int counter; private int term; private int[] A; int SelectionNonRecursive(int A[]
public class KthSmallest
{
private int counter;
private int term;
private int[] A;
int SelectionNonRecursive(int A[], int kthSmallest, int sizeOfA)
{
this.A = A;
if(kthSmallest == 1 || kthSmallest == sizeOfA)
{
return (LinearSearch(kthSmallest, sizeOfA));
}
else
{
for(int i = 0; i<sizeOfA; i++)
{
counter = 0;
for(int j = 0; j<sizeOfA; j++)
{
if(A[i] < A[j])
{
counter++;
}
}
if((sizeOfA - counter) == kthSmallest)
{
return A[i];
}
}
}
return 0;
}
int SelectionRecursive(int A[], int kthSmallest, int sizeOfA)
{
this.A = A;
return Selection_R(0, sizeOfA - 1, kthSmallest);
}
int Selection_R(int l, int r, int kthSmallest)
{
if(l<r)
{
if(kthSmallest == 1 || kthSmallest == A.length)
{
return (LinearSearch(kthSmallest, A.length));
}
else
{
int s = LomutoPartition(l, r);
if(s == kthSmallest - 1)
{
return A[s];
}
else if(s > (A[0] + kthSmallest - 1))
{
Selection_R(l, s-1, kthSmallest);
}
else
{
Selection_R(s+1, r, kthSmallest);
}
}
}
return 0;
}
int LomutoPartition(int l, int r)
{
int pivot = A[l];
int s = l;
for(int i = l+1; i<r; i++)
{
if(A[i] < pivot)
{
s += 1;
swap(A[s], A[i]);
}
}
swap(A[l], A[s]);
return s;
}
public void swap(int i, int j)
{
int holder = A[i];
A[i] = A[j];
A[j] = holder;
}
int LinearSearch(int kthSmallest, int sizeOfA)
{
term = A[0];
for(int i=1; i<sizeOfA; i++)
{
if(kthSmallest == 1)
{
if(term > A[i])
{
term = A[i];
}
}
else
{
if(term < A[i])
{
term = A[i];
}
}
}
return term;
}
}
public class KthDriver
{
public static void main(String[] args)
{
KthSmallest k1 = new KthSmallest();
int[] array = {7,1,5,9,3};
System.out.print(k1.SelectionRecursive(array, 3, array.length));
}
}
公共类KthSmallest
{
专用int计数器;
专用术语;
私人机构【】A;
int selection非递归(int A[],int kths最小,int sizeOfA)
{
这个A=A;
如果(kthSmallest==1 | | kthSmallest==sizeOfA)
{
返回(线性搜索(kthSmallest,sizeOfA));
}
其他的
{
对于LomutoPartition
方法中的(int i=0;i),您在swap
方法中传递数组元素:-
swap(A[s], A[i]); // Inside for loop
及
您的交换方法将它们视为索引
:-
public void swap(int i, int j) <-- // `i` and `j` are elements A[s] and A[i]
{
int holder = A[i]; <-- // You are accessing them as indices(A[i] -> A[A[s]])
A[i] = A[j];
A[j] = holder;
}
及
分别。并保持方法不变
请注意,您应该传递数组索引,而不是数组元素。如果传递数组元素,则方法中的交换将不会反映在数组中。因为,您的方法将有自己的元素副本。请包含堆栈跟踪。异常显示的确切位置是哪里?您可以发布堆栈跟踪吗?您可以缩小范围吗问题?在哪一行出现这些错误?调试器告诉了你什么?请告诉我们它发生在哪里。(在中确实应该有一个函数,如果问题包含单词“Exception”:D,您就不能发布w/o stacktrace)(对不起,用户,这种情况确实经常发生)不客气。下次发布问题时,请发布完整的堆栈跟踪。跟踪异常会更容易
public void swap(int i, int j) <-- // `i` and `j` are elements A[s] and A[i]
{
int holder = A[i]; <-- // You are accessing them as indices(A[i] -> A[A[s]])
A[i] = A[j];
A[j] = holder;
}
swap(s, i); // Inside for loop
swap(l, s); // Outside for loop