一、什么是冒泡排序
冒泡排序(Bubble sort)是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐渐交换到序列的一端,从而达到排序的目的。
具体步骤如下:
- 从序列的第一个元素开始,依次比较相邻的两个元素。
- 如果它们的顺序不正确(比如当前元素大于下一个元素),则进行交换,将较大的元素向序列的末尾移动。
- 继续向后遍历序列,重复进行相邻元素的比较和交换操作,直到完成一轮遍历。
- 重复上述步骤,直到序列排序完成,即没有发生任何元素交换的情况。
冒泡排序的一轮遍历会使至少一个元素移动到正确的位置,经过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)。
稳定排序:由于冒泡排序遇到相等的元素不交换,因此是稳定排序。