详解冒泡排序算法

作者: 随机的未知 | 来源:发表于2020-03-23 07:07 被阅读0次

基本思想

冒泡排序的基本思想是:
通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
逆序的含义:如果想把序列从小到大排序,那么两个数中前面的比后面的大就是逆序。
若需求是将序列从小到大排序,那么每一趟比较都会把值较大的逐渐从前面移动到后面。
就像水底的泡泡一样:
(如下图,图片来源于网络)

水底冒泡图片

例子

给定一个数组如下:
[ 5 , 8 , -2 , 20 -6 ]
定义两个变量 ij,初始状态 i 存第一个元素的索引,ji代表元素的下一个元素的索引;

如下图:

初始状态

第一趟排序

(1) 5 < 8不用发生交换

第一趟排序1
然后 i ,j 均向后移动; 第一趟排序2
(2) 8 > -2 需要发生交换 第一趟排序2
然后 i ,j 均向后移动; 第一趟排序3

(3) 8 < 20 不需要发生交换

第一趟排序4
然后 i ,j 均向后移动; 第一趟排序5

(4) 20 > -6 需要发生交换

第一趟排序6

此时 j已经不能向后移动,第一趟排序结束,将当前最大的元素 20 移动到了最后的位置。

第一趟排序7

第二趟排序

i ,j重新赋值如下:

第二趟排序初始状态
第二趟排序

第三趟排序

i ,j重新赋值如下:

第三趟排序初始状态 第三趟排序

第四趟排序

i ,j重新赋值如下:

第四趟排序初始状态 第四趟排序

四个数组均到达该到的位置,排序完毕。
由此可见,每一趟排序都会减少比较次数。
会 有数组长度-1趟排序。

代码

使用双重循环来完成:

int temp;//用于交换的临时变量
for(int i=0;i<arr.length - 1;i++){
        for(int j = 0;j<arr.length - 1 - i ; j++){
            if(arr[j] > arr[j + 1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
       }
}

优化

如果一趟排序都没有发生交换,表示已经有序了,没必要进行接下来的排序了。
可以定义一个 flag ,初始值为false,如果发生交换,就赋值为true,否则一直是false直接退出循环。
代码如下:

import java.lang.reflect.Array;
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        bubbleSort(new int[]{5,8,-2,20,-6});
    }
    public static void bubbleSort(int[] arr) {

        int temp;//用于交换的临时变量
        boolean flag = false;//表示是否进行交换
        for(int i=0;i<arr.length - 1;i++){
            for(int j = 0;j<arr.length - 1 - i ; j++){
                if(arr[j] > arr[j + 1]){
                    flag = true;
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag = false;//将flag重新置为false
            }
        }

        System.out.println(Arrays.toString(arr));
    }
}

时间复杂度

如果原数组有序,则遍历一遍就可以,最好的时间复杂度是
O(n);
如果原数组倒序,则比较次数是:
n-1 + n-2 + … + 2 + 1 = \frac{n(n-1)}{2} = O(n^2);
所以冒泡排序的时间复杂度是O(n^2)

稳定性

冒泡排序就是把逆序的元素进行交换,每次都是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

总结

冒泡排序的思想是通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
优化方法是,若一趟排序中没有发生交换则退出循环,已经有序。
冒泡排序的时间复杂度是O(n^2),是稳定的排序算法。

欢迎关注

欢迎大家的关注

扫描下方的二维码关注我的微信公众号:code随笔

微信公众号:code随笔

相关文章

  • 算法-冒泡排序

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

  • 经典排序算法总结

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

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

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

  • 排序算法笔记

    总结 算法详解 tips:以下算法中均按从小到大排序 一 冒泡排序/Bubble Sort 思路 采用两两比较并交...

  • 前端算法学习-第一篇

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

  • iOS算法总结-冒泡排序

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

  • tag11:排序 八大经典排序算法

    八大经典排序算法详解: 1、插入 将元素插入到合适的位置,复杂度O(n^2) 2、冒泡 不断比较相邻元素,冒泡排序...

  • 详解排序算法--希尔排序

    希尔排序 希尔排序的由来是根据插入排序的。读者若不了解插入排序,可以参考笔者的详解排序算法--插入排序和冒泡排序....

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

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

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

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

网友评论

    本文标题:详解冒泡排序算法

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