java书上的冒泡排序怎么和以前C语言里的不一样

不理解这个冒泡为什么这样写
img

//可以这样优化一下只比较前面
public class MaoPaoSort {
    
    public static void main(String[] args) {
        int[] arr = new int[] {5,3,7,2,9,1,4,8};
        int temp = 0;
        for(int i = 1; i < arr.length; i++) {
            for(int j = 0; j < i; j++) {
                if(arr[i] < arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for(int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }

}

一样的呀。
i=1,j=0
i=0,j=1
i=0,j=i+1
都可以

从逻辑上来说,有一种向前冒泡,和向后冒泡的算法。

public static void main(String[] args) {
        int [] num={1,5,9,6,4,8,7,3,14};
        //向数组索引大的一方依次排序。
//        for (int i = 0; i < num.length-1; i++) {
//            for (int j = 0; j < num.length-1-i; j++) {
//                if(num[j] > num[j+1]){
//                    int temp = num[j];
//                    num[j] = num[j+1];
//                    num[j+1] = temp;
//                }
//            }
//        }
        //向数组索引小的一方依次排序。
        for (int i = 0; i < num.length-1; i++) {
            for (int j = i+1; j < num.length; j++) {
                if(num[i] >num[j]){
                    int temp = num[j];
                    num[j] = num[i];
                    num[i] = temp;
                }
            }
        }
        System.out.println(MyArrays.toString(num));
    }

其实他是一轮将最大值或最小值排在最后面里面的for循环控制的将最大值或最小值排到数组末尾,外面的for循环控制次数

i是不动啊,没有体现两两比较啊,真的不是选择吗?我再去看下选择和冒泡。

每一次内层循环都会将i下标所代表位置选为最大值,因为每一次比较小标i右边都会选出最大值替换之,且每一次内存循环完i所代表下标位置的左边都会排好从小到大的顺序。刚开始可以只看左边,它是先排好两个数的,然后在两个数的基础上排好三个数,再排好四个数,依次往后

就是定义一个空值,然后循环进行比较,把拿到的最大的数放进去