我在java中编写了一个Insertion Sort的实现,并且很难解释一些奇怪的行为。
这是我的代码:
package algorithm.insertionsort;
public class InsertionSort {
public static void main(String[] args) {
int[] array = new int[]{10, 9, 8, 7, 6, 5, 4, 3, 202, 1, 400, 0, 12};
int[] sortedArray = insertionSort(array);
for (int element : sortedArray) {
System.out.print("" + element + " ");
}
}
public static int[] insertionSort(int[] a) {
for (int i = 1; i < a.length - 1; i++) {
int element = a[i];
int j = i - 1;
while (j >= 0 && a[j] > element) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = element;
}
return a;
}
}
这是输出:
0 1 3 4 5 6 7 8 9 10 202 400 12
为什么排序中排除了最终元素?
答案 0 :(得分:3)
你的循环中有一个小错字:
for (int i = 1; i < a.length - 1; i++) {
应该成为......
for (int i = 1; i < a.length; i++) {
当以这种方式修复时,你将迭代整个数组(除了第一个元素),而不是索引1处的元素和倒数第二个元素(其中12
,最后一个元素)之间的范围,被遗漏了)。
输出(已修复)
0 1 3 4 5 6 7 8 9 10 12 202 400
答案 1 :(得分:3)
因为您从index = 1
到index < length - 1
的循环被排除在外:
{10, 9, 8, 7, 6, 5, 4, 3, 202, 1 , 400, 0, 12}
^__________________________________^
相反,您必须从index = 1
循环到index < length
:
for (int i = 1; i < a.length; i++) {
现在迭代的范围是:
{10, 9, 8, 7, 6, 5, 4, 3, 202, 1 , 400, 0, 12}
^______________________________________^