zoukankan      html  css  js  c++  java
  • 排序算法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技术小栈

  • 相关阅读:
    沙雕玩意儿
    1558:聚会 ybt
    沙雕关于线段树的一点总结(滑稽)
    卑微
    沙雕题目 来自luogu
    甜茶好帅啊
    python 中字符串的格式化
    python的几个小程序
    python 第一课
    基于笔画宽度变换的自然场景文本检测方法
  • 原文地址:https://www.cnblogs.com/mmimo/p/15387998.html
Copyright © 2011-2022 走看看