【排序算法】冒泡排序

文章目录

  • 一:排序算法
    • [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);

相关推荐
緈福的街口7 分钟前
【leetcode】584. 寻找用户推荐人
算法·leetcode·职场和发展
今天背单词了吗98014 分钟前
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·考研·算法·蒙特卡洛算法
wjcurry43 分钟前
完全和零一背包
数据结构·算法·leetcode
hie988941 小时前
采用最小二乘支持向量机(LSSVM)模型预测气象
算法·机器学习·支持向量机
python_tty1 小时前
排序算法(一):冒泡排序
数据结构·算法·排序算法
皮蛋sol周2 小时前
嵌入式学习C语言(八)二维数组及排序算法
c语言·学习·算法·排序算法
森焱森2 小时前
单片机中 main() 函数无 while 循环的后果及应对策略
c语言·单片机·算法·架构·无人机
平和男人杨争争3 小时前
机器学习12——支持向量机中
算法·机器学习·支持向量机
10岁的博客3 小时前
代码编程:一场思维与创造力的革命
开发语言·算法
Aczone283 小时前
嵌入式 数据结构学习 (六) 树、哈希表与内核链表
数据结构·学习·算法