zoukankan      html  css  js  c++  java
  • 冒泡排序

    Code

    package kb.algorithm;
    
    public class BubbleSort {
    
        public static void main(String[] args) {
            int[] a = new int[]{3, 6, 4, 9, 1, 7, 2, 5};
            sort(a);
            StringBuilder sb=new StringBuilder(20);
            for (int i = 0; i < a.length; i++) {
               sb.append(a[i]);
               sb.append(",");
            }
            System.out.println(sb);
        }
    
        public static void sort(int[] a) {
            int size = a.length;
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size - i - 1; j++) {
                    if (a[j] > a[j + 1]) {
                        int temp = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = temp;
                    }
                }
            }
        }
    }
    
    

    执行结果

    1,2,3,4,5,6,7,9,
    

    分析改进

    每次找出最大的一个元素移到最右边。

    代码需要排序10次,当时上面的过程可以看到只需要5次即可完成这个排序,这是一个优化点,当内循环的执行完一次排序后如果没有发生数据交换(本例中的第五次),则说明整个列表已经全部排序排序完成了。

    对上面的代码做一个改进。

    package kb.algorithm;
    
    public class BubbleSort {
    
        public static void main(String[] args) {
            int[] a = new int[]{3, 6, 4, 9, 1, 7, 2, 5};
            sort(a);
            StringBuilder sb = new StringBuilder(20);
            for (int i = 0; i < a.length; i++) {
                sb.append(a[i]);
                sb.append(",");
            }
            System.out.println(sb);
        }
    
        public static void sort(int[] a) {
            int size = a.length;
            int executedCount = 0;
            for (int i = 0; i < size; i++) {
                boolean switched = false;
                for (int j = 0; j < size - i - 1; j++) {
                    if (a[j] > a[j + 1]) {
                        int temp = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = temp;
                        switched = true;
                    }
                }
                executedCount++;
                if (!switched) {
                    break;
                }
            }
            System.out.println("executedCount" + executedCount);
        }
    }
    

    执行结果

    executedCount6
    1,2,3,4,5,6,7,9,
    

    复杂度分析

    时间复杂度O(n^2)。空间复杂度O(1)。

    属于稳定性排序,当两个数字相同的时候,其位置是不会发生改变的。

    作者:iBrake
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    168. 吹气球
    395. 硬币排成线 II
    436. 最大正方形
    362. 滑动窗口的最大值(单调队列)
    python-网络安全编程第二天(文件操作)
    重闯Sqli-labs关卡第一天(1-4关)
    python-网络安全编程第一天(requests模块)
    PHP代码审计入门(SQL注入漏洞挖掘基础)
    PHP代码审计入门(敏感函数回溯参数过程)
    PHP核心配置基础解读
  • 原文地址:https://www.cnblogs.com/Brake/p/14772518.html
Copyright © 2011-2022 走看看