美文网首页
冒泡排序算法

冒泡排序算法

作者: 攻城狮l | 来源:发表于2019-04-20 21:35 被阅读0次

一、冒泡排序

冒泡排序的英文Bubble Sort,是一种最基础的交换排序。

大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。

二、实现思路

使用双重循环,循环比较相邻的两个数字,把较小的数字移动到右边,步骤如下:

  1. 第一次循环,相邻的两个数比较,小的数下沉到右边,循环比较length次,则会出现最小的数字在最后一位
  2. 第二次循环,相邻的两个数比较,小的数据下沉到右边,循环比较 length-1 次(因为第一次最小的数已在最右边,不要再比较最后一位),则会出现第二小的数字在倒数第二位
  3. 第n次循环,相邻的两个数比较,小的数据下沉到右边,循环比较 length-n 次,则会出现第二小的数字在倒数第n-1位

实现思路不清楚的可点此链接,有相关的图文介绍

三、代码实现

package xzg.algorithm;
/**
 * 冒泡排序算法
 */
public class BubbleSort {
    public static void main(String[] args) {
        int score[] = {3, 8, 1, 13, 24, 14, 41, 26, 5, 2};
        int[] bubbleSort = bubbleSort(score);
        System.out.print("冒泡排序结果:");
        for (int a = 0; a < score.length; a++) {
            System.out.print(score[a] + "\t");
        }
    }

    /**
     * 双重循环实现冒泡排序<p/>
     * 实现思路:<p/>
     * 1.第一次循环,相邻的两个数比较,小的数下沉到右边,循环比较length次,则会出现最小的数字在最后一位<p/>
     * 2.第二次循环,相邻的两个数比较,小的数据下沉到右边,循环比较 length-1 次(因为第一次最小的数已在最右边,不要再比较最后一位),则会出现第二小的数字在倒数第二位<p/>
     * 3.第n次循环,相邻的两个数比较,小的数据下沉到右边,循环比较 length-n 次,则会出现第二小的数字在倒数第n-1位<p/>
     *
     * @param arr 待排序数组
     * @return 排序完成的数组
     */
    public static int[] bubbleSort(int arr[]) {
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            //第i+1趟循环排序
            for (int j = 0; j < length - 1 - i; j++) {//循环比较 length - 1 - i次(因为后i项数据已排序完毕)
                if (arr[j] < arr[j + 1]) {//右边数据比左边的大,则交换位置
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.print("第" + (i + 1) + "次排序结果:");
            for (int a = 0; a < arr.length; a++) {
                System.out.print(arr[a] + "\t");
            }
            System.out.println();
        }
        return arr;
    }
}

bubbleSort方法输出结果如下:

第1次排序结果:8   3   13  24  14  41  26  5   2   1   
第2次排序结果:8   13  24  14  41  26  5   3   2   1   
第3次排序结果:13  24  14  41  26  8   5   3   2   1   
第4次排序结果:24  14  41  26  13  8   5   3   2   1   
第5次排序结果:24  41  26  14  13  8   5   3   2   1   
第6次排序结果:41  26  24  14  13  8   5   3   2   1   
第7次排序结果:41  26  24  14  13  8   5   3   2   1   
第8次排序结果:41  26  24  14  13  8   5   3   2   1   
第9次排序结果:41  26  24  14  13  8   5   3   2   1   
冒泡排序结果:41   26  24  14  13  8   5   3   2   1   
Process finished with exit code 0

可以看到其实到第6次排序后,已经排序成功了,相关算法是否可以优化呢?
答案是肯定的,我们可以增加一个标示位,用于标示第n次排列时,是否有进行位置交换,如果没有进行交换(说明已排序完毕),则终止排序即可。

优化后的代码如下:

  public static int[] bubbleSortOptimize(int arr[]) {
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            boolean isMove = false;//用于表示第i+1趟排序中是否有移动交换数据,如果没有则说明已排序完成,无需再次循环比较
            //第i+1趟循环排序
            for (int j = 0; j < length - 1 - i; j++) {//循环比较 length - 1 - i次(因为后i项数据已排序完毕)
                if (arr[j] < arr[j + 1]) {//右边数据比左边的大,则交换位置
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    //有移动交换数据,修改标示
                    isMove = true;
                }
            }
            if (!isMove){//如果没有移动交换数据则说明已排序完成,无需再次循环比较
                System.out.println("冒泡排序完成,无需再次比较数据");
                break;
            }
            System.out.print("第" + (i + 1) + "次排序结果:");
            for (int a = 0; a < arr.length; a++) {
                System.out.print(arr[a] + "\t");
            }
            System.out.println();
        }
        return arr;
    }

以下是优化后的排序输出结果。

bubbleSortOptimize方法输出结果如下:

第1次排序结果:8   3   13  24  14  41  26  5   2   1   
第2次排序结果:8   13  24  14  41  26  5   3   2   1   
第3次排序结果:13  24  14  41  26  8   5   3   2   1   
第4次排序结果:24  14  41  26  13  8   5   3   2   1   
第5次排序结果:24  41  26  14  13  8   5   3   2   1   
第6次排序结果:41  26  24  14  13  8   5   3   2   1   
冒泡排序完成,无需再次比较数据
冒泡排序结果:41   26  24  14  13  8   5   3   2   1   
Process finished with exit code 0

四、算法分析

冒泡排序总的平均时间复杂度为O(n^2)

参考文章如下:
https://www.cnblogs.com/lisaShare/p/9988043.html

相关文章

  • 算法-冒泡排序

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

  • 经典排序算法总结

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

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

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

  • 前端算法学习-第一篇

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

  • iOS算法总结-冒泡排序

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

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

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

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

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

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

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

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

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

  • 算法:冒泡排序

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

网友评论

      本文标题:冒泡排序算法

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