[排序算法] 冒泡排序的原理及其Java实现

背景


继上一篇《选择排序》之后的第二篇,笔者准备在本篇介绍冒泡排序。

冒泡排序 (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); // 缩小边界
	}

}

结语


冒泡排序,是一个经典的排序算法,但因其超高的常数复杂度,其性能甚至远不如选择排序,不推荐使用,仅了解即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值