排序算法-冒泡排序

355 阅读2分钟

简介

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

时间复杂度

O(n^2)

排序原理分析

思路分析:

两两比较,如果前面一个元素比后面元素大,那么就交换位置,依次比较到最后一个元素。 下一轮排除以确定顺序的元素,继续两两比较,如果前面一个元素比后面元素大,那么就交换位置 直到最后比较到只剩下两个元素比较,也就排序完成了。

排序规则: 从小到大排序

待排序数组:int[] arr = {-1, -3, -2, -6, 5, 2, 80, 49} (8个元素)

在这里插入图片描述

为什么不比较第8轮,因为总共8个数,第七轮确定了7个数排序后的位置,所以最后一个数的排序位置一定是正确的。

代码实现

public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = {-1, -3, -2, -6, 5, 2, 80, 49};

        bubbleSort(arr);

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


    public static void bubbleSort(int[] arr) {
        int temp;

        boolean flag = false;

        for (int i = 0; i < arr.length - 1; i++) {
            for (int k = 0; k < arr.length - 1 - i; k++) {
                if (arr[k] > arr[k + 1]) {
                    temp = arr[k];
                    arr[k] = arr[k + 1];
                    arr[k + 1] = temp;
                    flag = true;
                }
            }
            // 起优化作用,如果flag为false意味着在这轮中没有交换过等同于已经排序好。不用再比较,直接退出循环
            if (!flag) {
                break;
            }
            flag = false;
        }

    }

}

运行结果:

[-6, -3, -2, -1, 2, 5, 49, 80]

总结

其实就是两个两个比较,从前到后,第一大轮结束之后其实就确定了一个最大元素,放在数组最后一个位置。第二大轮确定了倒数第二大的元素,放在数组倒数第二个位置。第三大轮确定了第三大的元素,放在倒数第三个位置。每一大轮又排除之前排序好的元素,循环数组长度-1大轮,就确定了数组-1个元素的排序位置,由于数组长度-1个元素都排序好了,所以最后一个元素一定是最小的。也就达成了排序的效果。