我正在尝试使用基于插入的排序算法对大型数据文件进行排序,代码运行正常,但输出不正确。我一遍又一遍地研究它完全无济于事,谁能看到我出错的地方?
public void sort(Comparable[] items) {
for (int i = 1; i < items.length; i++) {
Comparable temp = items[i];
int j = i - 1;
while (j >= 0 && items[j].compareTo(items[j]) > 0) {
items[j + 1] = items[j];
j = j - 1;
}
items[j] = temp;
}
}
我生成的示例数据文件是......
2
1
3
5
9
6
7
4
8
显然输出应该是1,2,3,4 ... - 但我得到1 3 五 9 6 7 4 8 8
答案 0 :(得分:5)
items[j].compareTo(items[j])
应为items[j].compareTo(temp)
,否则您只是将项目与自身进行比较 - 您需要将其与要插入的对象进行比较。
然后items[j] = temp;
也会产生ArrayIndexOutOfBoundsException
因为,在循环结束时,items[j]
小于temp
或j == -1
,所以我们需要在此之后的位置插入 - 最简单的修复只是将其更改为items[j+1] = temp;
。
答案 1 :(得分:0)
for i ← 1 to length(A)
j ← i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
转换为Java:
import java.util.*;
class InsertionSortTest {
public static int[] insertionSort(int[] A) {
for (int i = 1; i < A.length; i++) {
int j = i;
while (j > 0 && A[j-1] > A[j]) {
int t = A[j];
A[j] = A[j-1];
A[j-1] = t;
j--;
}
}
return A;
}
public static void main (String[] args) {
int[] arr = { 5, 3, 0, 2, 1, 4 };
System.out.println(Arrays.toString(insertionSort(arr)));
}
}