冒泡排序双重for循环的意思

17md69uz
  • 5
新手上路,请多包涵
    public static void main(String[] args) {
        int[] arr = {11,9,13,26,24,35,46};
        int temp ;
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j]<arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        for(int n:arr) {
            System.out.print("   "+n);
        }

    }

请各位前辈帮我解释一下

for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-i-1;j++){

这里为何外层循环条件是i<arr.length-1 ,而内层循环条件是j<arr.length-i-1 , i和j能理解,只是不明白为何是arr.length-1,和arr.length-i-1.

回复
阅读 941
2 个回答
✓ 已被采纳

一切都只是为了让冒出来的不在参与循环。先来说说意思

  • arr.length-1 这个不用多说吧,下标是从0开始的。而数量是从1开始的。不用= 是因为一个不用比较。
  • arr.length-i-1 这是为了切除已经冒泡成功的元素。i是在逐渐递增的,所以它是在逐渐减少,就像从后面向前面移动。不用等于是因为下面有j+1

这么写可能容易理解点。

    private static void bubbleSort(int[] arr) {
        for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

arr.length-1 外面这层比较次数,最后只剩下数组第一位不需要比较
arr.length-i-1 里面这层是j和j+1相邻对比,所以j取数组最后一位的前一位

宣传栏