# 冒泡排序简介

# 视频教程

建议快进播放。

# 冒泡排序的基本思想

冒泡排序思路简述:每一轮将一个「未排定部分」最大的元素「冒泡」到「未排定部分」的末尾,直至整个数组有序。

  • 两两 比较 相邻 两个位置的元素,把较大的元素 交换 到上方;
  • 每一轮都会把当前最大的元素冒泡到数组的末尾。

为了方便大家观察「冒泡排序」的执行过程,我们把数组竖着摆放。可以看到:值越大的越先冒泡上来。

冒泡排序

我看到有一些朋友,把「选择排序」和「冒泡排序」搞混了。

# 「选择排序」和「冒泡排序」的区别

  • 「冒泡排序」每一轮的确是选出最值,但它是通过两两比较和交换,把最值元素渐渐地交换到数组的末尾,每一轮选出最值,需要交换多次;
  • 「选择排序」每一轮选出最小值,交换到数组的前面,每一轮只交换一次

说明

  • 相邻的两个元素进行比较,把比较大的元素排在后面,这样遍历一轮下来,就可以找到这一轮循环中最大的那个元素,我们把这个过程形象地称之为「冒泡」;
  • 由于每一轮循环都「冒泡」出一个这一轮循环最大的元素,所以上一轮循环的最后一个元素,不应该参加下一轮循环的比较了,这就是为什么内层循环的结束条件是 j < arr.length - i - 1 的原因。

参考代码

说明:该代码在「力扣」运行超时。

public class Solution {

    public int[] sortArray(int[] nums) {
        int len = nums.length;
        for (int i = len - 1; i >= 0; i--) {
            // 只要发生一次交换,就必须进行下一轮比较,
            for (int j = 0; j < i; j++) {
                if (nums[j] > nums[j + 1]) {
                    swap(nums, j, j + 1);
                }
            }
        }
        return nums;
    }

    private void swap(int[] nums, int index1, int index2) {
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;
    }
}

复杂度分析

  • 时间复杂度:,这里 是输入数组的长度;
  • 空间复杂度:

作者:liweiwei1419 链接:https://suanfa8.com/basic-sorting-algorithm/bubble-sort/introduction 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/18/2024, 11:23:03 PM