秦疆的Java课程笔记:58 数组 冒泡排序

发布时间 2023-12-05 15:45:49作者: Acolyte_9527
  • 总共有八大排序,其中冒泡排序无疑是较为出名的排序算法之一。

  • 冒泡排序的代码相当简单,两层循环,外层冒泡轮数,里层依次比较。

  • 当看到嵌套循环,应该立马意识到,这个算法的时间复杂度是\(O(n^2)\)

  • 冒泡排序基本步骤:

    • 比较数组中两个相邻元素,如果第一个数比第二个数大,就交换位置。
    • 每一次比较,产生出一个最大,或者最小的数字。
    • 下一轮就可以少一次排序。
    • 依次循环,直到结束。
public class ArrayDemo7 {  
    public static void main(String[] args) {  
        int[] a = {989,21354,566,12,3336,41,1,0};  
        int[] sort = sort(a);  
        System.out.println(Arrays.toString(sort));  
    }  
  
    public static int[] sort(int[] array){  
        //临时变量;  
        int temp = 0;  
        //外层循环,判断要循环多少次  
        for (int i = 0; i < array.length - 1; i++) {  
            //内层循环,判断两个数,如果第一个数比第二个数大,则交换位置  
            for (int j = 0; j < array.length-1-i; j++) {  
                if (array[j+1] < array[j]) {  
                    temp = array[j];  
                    array[j] = array[j+1];  
                    array[j+1] = temp;  
                }  
            }  
        }  
        return array;  
    }  
}
====效果如下====
[0, 1, 12, 41, 566, 989, 3336, 21354]
  • 思考:如何优化?
  • 通过flag标志减少没有意义的比较
public static int[] sort(int[] array){  
    int temp = 0;  
    boolean flag = false;  
    for (int i = 0; i < array.length - 1; i++) {  
        for (int j = 0; j < array.length-1-i; j++) {  
            if (array[j+1] < array[j]) {  
                temp = array[j];  
                array[j] = array[j+1];  
                array[j+1] = temp;  
                flag = true;  
            }  
        }  
        if (flag == false) {  
            break;  
        }  
    }  
    return array;  
}