排序算法2

排序算法2 - 冒泡排序

算法思路

依次比较相邻的元素,如果前一个元素比后一个元素大,则交换位置

第一轮排序结束后,最后一个元素就会是最大的数

比较剩下的数组元素(第 1 位到第 n - 2 位 ),方式同第一轮比较一样

以此类推,直到所有元素均排序完毕

代码实现

public void bubbleSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i > 0; i--) { 
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    // 这种写法比较抖机灵,不推荐,只是为做个介绍
    public void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

复杂度分析

时间复杂度为 O(N²) (第一次比较 n 个数,第二次比较 n-1 个数,第三次比较 n-2 个数... 呈等差数列分布,所以复杂度为 an² + bn + c 的格式)

不占用额外的内存空间

优化算法

冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

额外知识点: 元素交换

这里的交换方法(swap) 和我们平常写的不太一样,看上去似乎很有逼格,这是通过异或运算实现的,具体实现原理见算法之异或运算及其运用
欢迎大家来我博客逛逛 mmimo技术小栈

原文地址:https://www.cnblogs.com/mmimo/p/15387998.html