冒泡排序--简单排序

冒泡排序(Bubble Sort)介绍

很简单的思路,两两比较,将较大值移动到后面,然后继续比下去,这样一轮之后最大值就到最后了。然后取前面的数,继续比较。

思路推演:

1、和简单选择排序同样的两层循环,外层循环控制次数,次数为length - 1,因为最后一个数不需要比较。
2、内层循环依次进行两两比较,并将较大值移往后面,这样一轮循环之后最大值到了最后一位
3、优化一:往前渐进,已经放到最后的就不用再比较了,每次逐个减少内层循环的次数
4、优化二:探测本次内层循环是否有数据交换,如果没有交换,则已经有序,退出外层循环

时间复杂度:

比较次数: 1+2+3+…+(n-1) = n* (n-1) /2 ≈ O(n^2)
交换次数:最少为0,完全逆序的交换为1+2+3+。。。+(n-1)和比较次数相同为n的二次方,选择排序是0-n,冒泡排序是0-n^2,交换操作更占用CPU,所以选择排序效率上优于冒泡排序
经过优化的冒泡排序,在某些场合,可以提前退出循环,这样次数上相对少一些,但是这只是比较的次数,CPU对于比较操作耗时不大,所以这部分区别不大。

稳定性:

只有大于才会交换,等于不会进行任何动作,所以是稳定的
可以实现为稳定的,如果写的不好,也可以是不稳定的

Java代码实现:

public static void main(String[] args){
    int[] arr = {10, 1, 4, 2, 8, 3, 5};

    System.out.println(Arrays.toString(bubbleSort(arr)));
}

public static int[] bubbleSort(int[] arr){
    // 外层循环控制次数
    // 循环n - 1次即可
    int len = arr.length;
    int switchTimes = 0;
    for(int i = 0 ;i < len - 1; i++){
        switchTimes = 0;
        // 从0行进到i的len - i的位置即可,不包括len
        for(int j = 0; j < len - i - 1; j++){
            if(arr[j] > arr[j + 1]){
                swap(arr, j, j + 1);
                switchTimes++;
            }
        }
        if(switchTimes == 0){
            break;
        }
    }

    return arr;
}

public static void swap(int[] arr, int i, int j){
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

猜你喜欢

转载自blog.csdn.net/u011531425/article/details/80550533