背景
继上一篇《选择排序》之后的第二篇,笔者准备在本篇介绍冒泡排序。
冒泡排序 (Selection Sort)
本文要讲的排序算法是排序算法中最基本算法之一的冒泡排序(Bubble Sort) 。
什么是冒泡排序?
冒泡排序,其实现方式,是在每一轮操作中从头部开始把相对较大的数组后部移动,这途中如果遇到更大的元素,那就选择更大的元素向后移动。这样能保证每一轮移动都能让最大的元素“冒泡”到数组尾部。也正是因为这个特性,这个算法被命名为冒泡排序。
冒泡排序的空间时间复杂度
时间复杂度: O(n²),一共n轮,每一轮需要遍历剩余所有的元素,所以复杂度为n²。而因为相较于选择排序次数庞大的交换操作,导致常数复杂度远高于选择排序。
空间复杂度: O(n),通常的实现是破坏性的in-memory实现,即在给定的原数组上做破坏性排序。
冒泡排序的实现
冒泡排序的样例代码和测试代码在笔者githubdemo仓库里能找到。
/**
* 冒泡排序,O(n²),稳定
* @author toranekojp
*/
public final class BubbleAscendingSort extends AbstractAscendingSort {
@Override
protected void doSort(int[] nums) {
assert nums != null;
// 用于表示冒泡排序尾部边界不断缩小的过程。
int boundle = nums.length;
do {
for (int i = 1; i < boundle; i++) {
if (nums[i - 1] > nums[i]) { // 冒泡
swap(nums, i - 1, i);
}
}
} while (--boundle != 0); // 缩小边界
}
}
结语
冒泡排序,是一个经典的排序算法,但因其超高的常数复杂度,其性能甚至远不如选择排序,不推荐使用,仅了解即可。