代码改变世界

冒泡排序

2022-12-23 17:50  通往神之路  阅读(69)  评论(0编辑  收藏  举报

  冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

  我用一个例子,带你看下冒泡排序的整个过程。我们要对一组数据 4,5,6,3,2,1,从小到大进行排序。第一次冒泡操作的详细过程就是这样:

 

可以看出,经过一次冒泡操作之后,6 这个元素已经存储在正确的位置上。要想完成所有数据的排序,我们只要进行 6 次这样的冒泡操作就行了。

 

 实际上,刚讲的冒泡过程还可以优化。当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。我这里还有另外一个例子,这里面给 6 个元素排序,只需要 4 次冒泡操作就可以了。

 

 

冒泡排序算法的原理比较容易理解,具体的代码我贴到下面,你可以结合着代码来看我前面讲的原理。

public class Test {
    public static void main(String[] args) {
        int [] a = {5,3,6,2,7,8,1,9};
        bubbleSort(a,8);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

    public static  void bubbleSort(int[] a,int n){

        if(n <=1) return;
        for (int i = 0; i < n; i++) {
            //提交退出冒泡排序的标志位;
            boolean flag = false;
            for (int j = 0; j < n-i-1; j++) {
                //比较,交换
                if(a[j] > a[j+1]){
                    int tmp = a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                    //表示数据有交换
                    flag = true;
                }
            }
            if(!flag){
                //没有数据交换,提前退出
                break;
            }
        }
    }
}

执行结果: