为什么我们不能在插入sort的while循环中更改语句的顺序?

时间:2014-06-06 02:59:38

标签: java algorithm sorting insertion-sort

如下所示是学校教授的基本插入排序算法。如果你改变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;
}

如果有其他方法可以实现相同的算法,那么条件循环语句的顺序无关紧要?

2 个答案:

答案 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]);
    }
}