zoukankan      html  css  js  c++  java
  • 冒泡排序算法(四)

    一、冒泡排序优化二
    二、算法演示

    三、代码算法分析
    class MaoPaoSort {
        void maoPaoSort(int[] array) {
            for (int i = 0; i < array.length - 1; i++) {
                for (int j = 0; j < array.length - 1 - i; j++) {
                    if (array[j] > array[j + 1]) {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
        }
    
        void maoPaoSortOptimized(int[] array) {
    
            int count = 0;
            int comparisons = 0;
            for (int i = 0; i < array.length - 1; i++) {
                boolean flag = false;
                count++;
                for (int j = 0; j < array.length - 1 - i; j++) {
                    if (array[j] > array[j + 1]) {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                        flag = true;  //说明发生了交换,那么此时将标志位flag设置位true说明发生了交换
                    }
                    comparisons++;
                }
                if (!flag)   //在每一趟(也就是第一层循环的每一次循环)都判断flag的值,如果flag为false,也就是说这一趟数据无任何交换,那么就说明数据已经被排好了,不需要再进行循环了
                    break;
            }
            System.out.println("共走了" + count + "趟");
            System.out.println("共比较了"+comparisons+"次");
        }
    
        void maoPaoSortOptimizedSecond(int[] array) {
            int count = 0;
            int pos = array.length - 1;
            int comparisons = 0;
            for (int i = 0; i < array.length - 1; i++) {
                boolean flag = false;
                int record = 0 ;
                //最后一次交换的位置
                count++;
                for (int j = 0; j < pos; j++) {
                    if (array[j] > array[j + 1]) {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                        flag = true;  //说明发生了交换,那么此时将标志位flag设置位true说明发生了交换
                        record = j;  //记录最后一次发生交换的位置
                    }
                    comparisons++;
                }
                if (!flag)   //在每一趟(也就是第一层循环的每一次循环)都判断flag的值,如果flag为false,也就是说这一趟数据无任何交换,那么就说明数据已经被排好了,不需要再进行循环了
                    break;
                pos = record;
    
            }
            System.out.println("共走了" + count + "趟");
            System.out.println("共比较了"+comparisons+"次");
        }
    
    }
    
    
    
    
    
    import java.util.Arrays;
    
    public class Sort {
        public static void main(String[] args) {
            int[] ints = {2, 34, 4, 55, 88};
            MaoPaoSort maoPaoSort = new MaoPaoSort();
            maoPaoSort.maoPaoSort(ints);
            System.out.println("简单冒泡排序" + Arrays.toString(ints));
            System.out.println("=======================================");
    
            int[] ints1 = {88, 2, 4, 34, 55};
            maoPaoSort.maoPaoSortOptimized(ints1);
            System.out.println("优化冒泡排序一" + Arrays.toString(ints1));
            System.out.println("=======================================");
    
    
            int[] ints2 = {88, 2, 4, 34, 55};
            maoPaoSort.maoPaoSortOptimizedSecond(ints2);
            System.out.println("优化冒泡排序二" + Arrays.toString(ints2));
            System.out.println("=======================================");
    
    
            int[] ints3 = {1, 2, 5, 7, 4, 3, 6, 8, 9, 10};
            maoPaoSort.maoPaoSortOptimized(ints3);
            System.out.println("优化冒泡排序一" + Arrays.toString(ints3));
    
            System.out.println("=======================================");
    
            int[] ints4 = {1, 2, 5, 7, 4, 3, 6, 8, 9, 10};
            maoPaoSort.maoPaoSortOptimizedSecond(ints4);
            System.out.println("优化冒泡排序二" + Arrays.toString(ints4));
        }
    }
    
    
    四、运行结果对比
    简单冒泡排序[2, 4, 34, 55, 88]
    =======================================
    共走了2趟
    共比较了7次
    优化冒泡排序一[2, 4, 34, 55, 88]
    =======================================
    共走了2趟
    共比较了7次
    优化冒泡排序二[2, 4, 34, 55, 88]
    =======================================
    共走了4趟
    共比较了30次
    优化冒泡排序一[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    =======================================
    共走了4趟
    共比较了19次
    优化冒泡排序二[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    Process finished with exit code 0
    
  • 相关阅读:
    347. 前 K 个高频元素(桶排序、堆排序)
    322. 零钱兑换 && 416. 分割等和子集(0-1背包问题)
    739. 每日温度 && 503. 下一个更大元素 II (单调栈)
    1110. 删点成林
    个人纪录
    pub get failed (server unavailable) -- attempting retry 1 in 1 second?
    python 遍历文件夹重命名
    flutter vscode 连接iphone失败
    部署以太坊合约
    Web漏洞扫描工具AppScan10介绍
  • 原文地址:https://www.cnblogs.com/shisanyue/p/13510194.html
Copyright © 2011-2022 走看看