class Insertionsort
{
int A[] = {5,2,4,6,1,3};
void insertionSort()
{
for(int j=2;j<A.length;j++)
{
int key = A[j];
int i = j-1;
while(i>0 && A[i]>key)
{
A[i+1]=A[i];
i=i-1;
}
A[i+1]=key;
}
for(int j = 0;j<=A.length;j++)
{
System.out.println(A[j]);
}
}
public static void main(String args[])
{
Insertionsort is = new Insertionsort();
is.insertionSort();
}
}
问题是:
输出为5 1 2 3 4 6而不是1 2 3 4 5 6。
怎么办?
答案 0 :(得分:1)
这导致错误:
for(int j = 0;j<=A.length;j++)
System.out.println(A[j]);
数组的最大索引为length - 1
,因此请将其更改为:
for(int j = 0;j<A.length;j++)
System.out.println(A[j]);
更好的是,为什么不使用增强型for
?这样你就不会犯这种错误:
for(int a : A)
System.out.println(a);
返回您的算法:
从j=2
开始,您省略了第一个元素,因此请将其更改为j=1
你的内部循环应该一直到i>=0
否则你也省略了第0个元素(数组索引是从0开始的):
for (int j = 1; j < A.length; j++) {
int key = A[j];
int i = j - 1;
while (i >= 0 && A[i] > key) {
A[i + 1] = A[i];
i = i - 1;
}
A[i + 1] = key;
}
这将打印1 2 3 4 5 6
(自使用println()
以来的新行)。
答案 1 :(得分:1)
如果要对数组进行排序,只需使用Arrays类中的Sort()。
Arrays.sort(yourArray);
答案 2 :(得分:0)
for(int j = 0;j<=A.length;j++)
更改为j<A.length
以使您的OutOfBounds异常消失。
另外,你的其他循环有错误的开始/结束条件
for(int j=2;j<A.length;j++)
应该从j=1
开始,while(i>0 && A[i]>key)
应该有i>=0
,否则数组中的第一个元素将在您的排序中跳过(5)。
答案 3 :(得分:0)
在排序循环中,初始化j = 2
然后从int key = A[j];
数组中获取一个数字,因此您尝试排序的数组中的第一个数字是索引2.因为数组中的第一个元素索引为0,排序时省略5和2。将循环更改为
for(int j = 0; j < A.length(); j++){
int key = A[j];
int i = j-1;
....
答案 4 :(得分:-1)
类Insertionsort {
int A [] = {5,2,4,6,1,3};
void insertionSort() {
for(int j=1;j<A.length;j++)
{
int key = A[j];
int i = j-1;
while(i>=0 && A[i]>key)
{
A[i+1]=A[i];
i=i-1;
}
A[i+1]=key;
}
for(int j = 0;j<A.length;j++)
{
System.out.print(A[j] + " ");
}
}
public static void main(String args []) {
Insertionsort = = new Insertionsort();
is.insertionSort();
}
}