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技术小栈

  • 相关阅读:
    Java openrasp学习记录(一)
    Java ASM3学习(3)
    Java ASM3学习(2)
    Java Instrumentation插桩技术学习
    Java ASM3学习(1)
    从JDK源码学习HashSet和HashTable
    从JDK源码学习HashMap
    从JDK源码学习ArrayList
    Java XXE漏洞典型场景分析
    CVE-2020-7961 Liferay Portal 复现分析
  • 原文地址:https://www.cnblogs.com/mmimo/p/15387998.html
Copyright © 2011-2022 走看看