【排序算法】冒泡排序

文章目录

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

一:排序算法

1.1 介绍

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

1.2 分类

1) 内部排序
指将需要处理的所有数据都加载到内部存储器中进行排序。
2) 外部排序法
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
3) 常见的排序算法分类
【排序算法】冒泡排序_第1张图片

二:冒泡排序

2.1 基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置
一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

【排序算法】冒泡排序_第2张图片

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 代码实现

/**
 * @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张图片

三:算法性能分析

3.1 时间复杂度

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

3.2 空间复杂度

空间复杂度就是在交换元素时那个临时变量所占的内存空间;
最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);

你可能感兴趣的:(排序算法,算法)