【排序算法】冒泡排序

文章目录

  • 一:排序算法
    • [1.1 介绍](#1.1 介绍)
    • [1.2 分类](#1.2 分类)
  • 二:冒泡排序
    • [2.1 基本介绍](#2.1 基本介绍)
    • [2.2 图解冒泡排序算法](#2.2 图解冒泡排序算法)
    • [2.3 代码实现](#2.3 代码实现)
  • 三:算法性能分析
    • [3.1 时间复杂度](#3.1 时间复杂度)
    • [3.2 空间复杂度](#3.2 空间复杂度)

一:排序算法

1.1 介绍

排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。

1.2 分类

1) 内部排序

指将需要处理的所有数据都加载到内部存储器中进行排序。
2) 外部排序法

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
3) 常见的排序算法分类

二:冒泡排序

2.1 基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置

一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

2.2 图解冒泡排序算法

以3, 9, -1, 10, 20为例

第一趟排序

(1) 3, 9, -1, 10, 20 // 如果相邻的元素逆序就交换

(2) 3, -1, 9, 10, 20

(3) 3, -1, 9, 10, 20

(4) 3, -1, 9, 10, 20

第二趟排序

(1) -1, 3, 9, 10, 20 //交换

(2) -1, 3, 9, 10, 20

(3) -1, 3, 9, 10, 20

第三趟排序

(1) -1, 3, 9, 10, 20

(2) -1, 3, 9, 10, 20

第四趟排序

(1) -1, 3, 9, 10, 20

总结:

(1) 一共进行 数组的大小-1 次 大的循环

(2) 每一趟排序的次数在逐渐的减少

(3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化

2.3 代码实现

java 复制代码
/**
 * @author ikun
 * 冒泡排序
 */
public class BubbleSort {


    /**
     * 冒泡排序
     * 冒泡排序的时间复杂度为O(n的平方)
     *
     * @param array 排序前的数组
     * @return 排序后的数组
     */
    public static int[] bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            //标识符,表示有没有进行过交换
            boolean flag = false;
            //内层循环控制两两比较的次数
            //将最大的数排在最后,比较的次数就是数组长度减一次
            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;
                }
            }
            //System.out.println("第" + (i + 1) + "次排序后的数组为:" + Arrays.toString(array));
            //表示没有发生过交换
            if (!flag) {
                //如果内层循环没有发生任何交换,则说明数组已经排好序了
                break;
            }
        }
        return array;
    }


    /**
     * 这个方法用来测试冒泡排序
     */
    public static void main(String[] args) {
        //int[] array = {59, 66, 14, 89, 12, 16, 20, 63};
        //测试一下冒泡排序的速度O(n的平方),测试80000条数据
        long start = System.currentTimeMillis();
        int[] array = new int[8];
        for (int i = 0; i < array.length; i++) {
            //Math.random() * 80000生成0到80000的随机数
            array[i] = (int) (Math.random() * 100);
        }
        System.out.println("排序前的数组为:" + Arrays.toString(array));
        int[] bubbleSort = bubbleSort(array);
        System.out.println("排序后的数组为:" + Arrays.toString(bubbleSort));

        long end = System.currentTimeMillis();
        System.out.println("执行时间为:" + (end - start));

    }
}

运行结果:

三:算法性能分析

3.1 时间复杂度

最优时间复杂度、最坏时间复杂度、平均时间复杂度都是O(n^2)。

3.2 空间复杂度

空间复杂度就是在交换元素时那个临时变量所占的内存空间;

最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;

最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);

平均的空间复杂度为:O(1);

相关推荐
大胆飞猪15 小时前
递归、剪枝、回溯算法---全排列、子集问题(力扣.46,78)
算法·leetcode·剪枝
Kisorge17 小时前
【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
stm32·嵌入式硬件·算法
铭哥的编程日记18 小时前
深入浅出蓝桥杯:算法基础概念与实战应用(二)基础算法(下)
算法·职场和发展·蓝桥杯
Swift社区18 小时前
LeetCode 421 - 数组中两个数的最大异或值
算法·leetcode·职场和发展
cici1587418 小时前
基于高光谱成像和偏最小二乘法(PLS)的苹果糖度检测MATLAB实现
算法·matlab·最小二乘法
StarPrayers.19 小时前
自蒸馏学习方法
人工智能·算法·学习方法
大锦终19 小时前
【动规】背包问题
c++·算法·动态规划
智者知已应修善业20 小时前
【c语言蓝桥杯计算卡片题】2023-2-12
c语言·c++·经验分享·笔记·算法·蓝桥杯
hansang_IR20 小时前
【题解】洛谷 P2330 [SCOI2005] 繁忙的都市 [生成树]
c++·算法·最小生成树
Croa-vo20 小时前
PayPal OA 全流程复盘|题型体验 + 成绩反馈 + 通关经验
数据结构·经验分享·算法·面试·职场和发展