美文网首页
【算法】冒泡排序

【算法】冒泡排序

作者: 天空若放晴 | 来源:发表于2019-11-26 22:10 被阅读0次

基本思想:

把数组中相邻的元素两两比较,根据大小来交换元素位置。第一轮两两交换之后,可以得出最大值会在最右边;接着重复上面的动作,进行下一轮交换。知道所有元素从小到大排序位置。

  • BubbleSort 0.1 version
    public static void bubbleSort1(int arr[]) {
        int tmp = 0;
        //开始遍历数组 进行两两比较
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-i-1; j++) {
                //相邻元素两两比较 把大的放到右边。
                if (arr[j]>arr[j+1]) {
                    tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                }
            }
        }
    }

关于优化

在冒泡排序的后期排序的过程中,其实数组中的数据可能已经处于有序的状态,如果此时继续使用基础版本的排序会大大降低程序的性能,耗费不必要的时间。

我们可以在冒泡排序交换前设置一个布尔型的变量来表示数组是否有序,如果进行交换操作即数组处于无序状态;如果没有进行数据交换即数组已经有序,此时可以跳出循环,结束程序。

  • BubbleSort 0.2 version
    public static void bubbleSort2(int arr[]) {
        int tmp = 0;
        //开始遍历数组 进行两两比较
        for (int i = 0; i < arr.length-1; i++) {
            //有序标记 每一轮开始都为true
            boolean isSorted = true;
            for (int j = 0; j < arr.length-i-1; j++) {
                //相邻元素两两比较 把大的放到右边。
                if (arr[j]>arr[j+1]) {
                    tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    //有交换 即无序
                    isSorted = false;
                }
            }
            //如果数组是有序的 则跳出循环
            if (isSorted) {
                break;
            }
        }
    }

有一种情况,如果在一开始排序的时候数组已经呈现半有序的状态,程序按基本版的操作一定是多做工的,所以我们可以记录下每一轮最后交换的位置,这个位置就是数组有序和无序的分界。这样下一轮的排序就可以在这个临界点结束。

  • BubbleSort 0.3 version
//避免半有序的数组多次循环 如{3,2,4,1,5,6,7,8} 。
    public static void bubbleSort3(int arr[]) {
        int tmp = 0;
        //开始遍历数组 进行两两比较
        for (int i = 0; i < arr.length-1; i++) {
            //有序标记 每一轮开始都为true
            boolean isSorted = true;
            //设置无序边界 每次比较只需比到这里为止
            int sortBorder = arr.length-1;//初始值为最右
            for (int j = 0; j < sortBorder; j++) {
                //相邻元素两两比较 把大的放到右边。
                if (arr[j]>arr[j+1]) {
                    tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    //有交换 即无序
                    isSorted = false;
                    //记录最后一次交换的位置
                    sortBorder = j;
                }
            }
            //如果数组是有序的 则跳出循环
            if (isSorted) {
                break;
            }
        }
    }

总结

上面就是冒泡排序及其优化之后的代码,接下来学习的是选择排序。

相关文章

  • 算法-冒泡排序

    算 法:冒泡排序算法时间复杂度: 冒泡排序算法概述 冒泡排序伪代码 冒泡排序实现 冒泡排序算法概述 冒泡排...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • iOS算法总结-冒泡排序

    iOS算法总结-冒泡排序 iOS算法总结-冒泡排序

  • python 冒泡排序和选择排序算法

    插入排序算法 冒泡排序算法

  • Java基础(冒泡排序与选择排序)

    冒泡排序 冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一...

  • 基本算法——快速排序算法

    快速排序算法是对冒泡算法的改进。所以我们首先来简单的谈谈冒泡算法。 1.冒泡算法 冒泡排序(Bubble S...

  • 7.4-全栈Java笔记:三种经典算法

    冒泡排序算法 冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。 算法重复地...

  • 算法:冒泡排序

    本文内容:1、什么是冒泡排序?2、冒泡排序的 C/OC 实现与算法分析。 算法总目录:算法? 1、什么是冒泡排序?...

网友评论

      本文标题:【算法】冒泡排序

      本文链接:https://www.haomeiwen.com/subject/czxuwctx.html