java - 冒泡排序

一、什么是冒泡排序

冒泡排序(Bubble sort)是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐渐交换到序列的一端,从而达到排序的目的。

具体步骤如下:

  1. 从序列的第一个元素开始,依次比较相邻的两个元素。
  2. 如果它们的顺序不正确(比如当前元素大于下一个元素),则进行交换,将较大的元素向序列的末尾移动。
  3. 继续向后遍历序列,重复进行相邻元素的比较和交换操作,直到完成一轮遍历。
  4. 重复上述步骤,直到序列排序完成,即没有发生任何元素交换的情况。

冒泡排序的一轮遍历会使至少一个元素移动到正确的位置,经过n-1轮的遍历(n为序列长度),即可完成排序。冒泡排序的时间复杂度为O(n^2)。

冒泡排序虽然简单易懂,但对于大规模的数据排序效率较低,不适用于处理大量数据的情况。然而,对于小规模的数据或者部分有序的序列,冒泡排序仍有一定的实际应用价值。

二、代码实现

注意:本代码已效率优化,经过优化,冒泡排序的最差平均时间复杂度仍为 O(n^2);但当输入数组完全有序时,可达到最佳时间复杂度 O(n)。


    public static void BubbleSort(int[] nums){
        int size = nums.length;
        // 外循环:未排序区间为 [0, i]
        for(int i = size - 1 ; i > 0 ; i--){
             // 记录交换元素
             boolean flag = false;
            // 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
            for(int j = 0 ; j < i ; j++){
                if(nums[j] > nums[j+1]){
                    // 记录交换元素
                    flag = true;
                    // 交换 nums[j] 与 nums[j + 1]
                    int tmp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = tmp;
                }
            }
            if (flag == false){
                // 此轮冒泡未交换任何元素,直接跳出
                return ;
            }
        }
    }

三、算法特性

时间复杂度: O(n^2),各轮冒泡遍历的数组长度依次为 n−1、n−2、…、2、1 ,总和为 (n−1)n/2 。在引入flag优化后,最佳时间复杂度可达到 O(n) 。

空间复杂度:O(1)。

稳定排序:由于冒泡排序遇到相等的元素不交换,因此是稳定排序。

你可能感兴趣的:(数据结构,java,算法,开发语言)