如下所示是学校教授的基本插入排序算法。如果你改变while循环参数的顺序,它就不起作用。
public static int[] insertionSort(int[] A){
for(int i =1; i<A.length;i++){
int key = A[i];
int j = i;
while(j>0&&A[j-1]>key){
A[j]=A[j-1];
j--;
}
A[j]=key;
}
return A;
}
更改后(现在代码不起作用,它将给出java.lang.ArrayIndexOutOfBoundsException:-1 expection):
public static int[] insertionSort(int[] A){
for(int i =1; i<A.length;i++){
int key = A[i];
int j = i;
while(A[j-1]>key&&j>0){
A[j]=A[j-1];
j--;
}
A[j]=key;
}
return A;
}
如果有其他方法可以实现相同的算法,那么条件循环语句的顺序无关紧要?
答案 0 :(得分:5)
由于短路评估。
如果&&
的前半部分为假,则根本不会评估后半部分(因为结果不可能是真的)。
因此,您可以撰写j > 0 && A[j - 1]...
,A[j - 1]
只会在j > 0
时进行评估。
答案 1 :(得分:-1)
您可以按如下方式改进上面的代码。现在,while循环永远不会因arr[-1]
条件而失败,因为每次j==-1
循环都会中断。
public static void InsertionSort()
int j, temp;
Scanner sc = new Scanner(System.in);
System.out.println("enter the size");
int n = sc.nextInt();
int arr[] = new int[n];
System.out.println("enter the elements");
for (int i = 0; i < n; i++)
{
arr[i] = sc.nextInt();
}
for (int i = 1; i < n; i++)
{
temp = arr[i];
j = i - 1;
while (arr[j] > temp && j >= 0)
{
arr[j + 1] = arr[j];
j = j - 1;
if (j == -1)
break;
}
arr[j + 1] = temp;
}
System.out.println("Array Sorted through Insertion Sort");
for (int i = 0; i < n; i++)
{
System.out.println(arr[i]);
}
}