背景
继上一篇《选择排序》之后的第二篇,笔者准备在本篇介绍冒泡排序。
冒泡排序 (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); // 缩小边界
}
}
结语
冒泡排序,是一个经典的排序算法,但因其超高的常数复杂度,其性能甚至远不如选择排序,不推荐使用,仅了解即可。
本文深入讲解了冒泡排序算法的基本原理、实现方式及其空间时间复杂度。冒泡排序是一种通过反复遍历数组,将最大元素逐步移动至数组末尾的排序方法。尽管其时间复杂度较高,但在理解排序算法原理方面仍具有重要价值。
1万+

被折叠的 条评论
为什么被折叠?



