算法01 - 排序算法之冒泡排序和选择排序

 那么这一篇文章,就分享一下今天学到的两个排序算法吧。

冒泡排序

什么是冒泡排序呢?

冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是通过重复比较相邻的元素,并根据需要交换它们的位置,使得较大的元素逐步“冒泡”到序列的末端。由于每次遍历都将未排序部分的最大元素移动到正确的位置,因此称为“冒泡排序”。

冒泡排序的工作原理
  1. 初始状态:从序列的第一个元素开始,依次比较相邻的两个元素。
  2. 比较与交换
    • 如果前一个元素比后一个元素大,则交换它们的位置。
    • 否则,保持不变。
  3. 遍历一轮:完成一轮比较后,序列中最大的元素被移动到序列的末端。
  4. 重复过程:对剩下的未排序部分重复上述过程,直到整个序列有序。

下面是今天我做的一道例题,通过循环遍历进行比较,得出一个升序的新数组,然后将它打印在控制台上,感兴趣的小伙伴可以copy一下试试哦。

/*
冒泡排序
    相邻的两个元素进行比较,小的放左边大的放右边,完成升序排列

实现步骤
    确定总共需要做几轮: 数组长度-1
    每轮比较几次: 轮数从0计数的话, 就是数组长度-1-当前轮数
    比较规则: 相邻两个元素比较,大的放在右边
*/
public class Demo1 {
    public static void main(String[] args) {
        int[] arr = {5, 2, 3, 1};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void bubbleSort(int[] arr) {
        //轮数
        for (int i = 0; i < arr.length - 1; i++) {
            //第i轮比较
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}
接下来,我说一下冒泡排序的时间空间复杂度和它的优缺点吧。
冒泡排序的时间复杂度
  • 最坏情况(数组按降序排列):需要进行最多的交换,时间复杂度为 O(n²)
  • 最好情况(数组已经有序):只需进行一次遍历,无需交换,时间复杂度为 O(n)
  • 平均情况:时间复杂度为 O(n²)
冒泡排序的空间复杂度
  • 空间复杂度:冒泡排序是一种原地排序算法,只需常数级别的额外空间,空间复杂度为 O(1)
冒泡排序的优缺点

优点

  • 实现简单,易于理解和编写。
  • 对于已经基本有序的数组,效率较高(最佳时间复杂度为 O(n))。

缺点

  • 时间复杂度较高,尤其是对于大规模数据,效率较低。
  • 不适合处理大数据集。

等后面深入学习会给大家更新冒泡算法的优化代码di。

那么,就到了今天的第二个算法了。

选择排序

什么是选择排序呢?

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从未排序的部分中选择出最小(或最大)的元素,放到已排序部分的末尾,直到整个数组有序。

选择排序的基本思想:
  • 将数组分为已排序和未排序两部分。
  • 每一轮从未排序的部分中选择最小(或最大)的元素,将其与未排序部分的第一个元素交换位置。
  • 随着每一轮的执行,已排序部分逐渐扩大,未排序部分逐渐缩小,直到整个数组排序完成。
选择排序的步骤:
  1. 初始状态:已排序部分为空,未排序部分为整个数组。
  2. 第1轮:在未排序部分中找到最小元素,将其与未排序部分的第一个元素交换位置。此时,已排序部分包含一个元素,未排序部分缩小一个元素。
  3. 第2轮:在未排序部分中找到最小元素,将其与未排序部分的第一个元素交换位置。已排序部分增加一个元素,未排序部分继续缩小。
  4. 重复上述过程,直到未排序部分只剩一个元素,排序完成。

同样,给大家展示一段我今天写的一段小代码。

/*
选择排序
    每轮选择当前位置,开始找后面的最小值,与当前位置交换

关键点分析
    确定总共需要做几轮: 数组长度-1
    每次的基准位:轮数从0计数的话, 就是基准位索引敲好就是轮数
    比较规则: 以每次的第一个为基准做比较,谁小谁来基准位
*/
public class Demo2 {
    public static void main(String[] args) {
        int[] arr = {5, 2, 3, 1};
        selectionSort(arr);
        System.out.println(Arrays.toString(arr));
    }


    private static void selectionSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
}

和冒泡算法一样,向大家输出一点选择排序的特点和优缺点。

选择排序的特点:
  • 时间复杂度:无论输入的数组是否有序,选择排序的时间复杂度始终为 O(n2)O(n^2)O(n2),因为每一轮都需要在未排序部分找到最小元素并交换位置。
  • 空间复杂度:空间复杂度为 O(1)O(1)O(1),因为选择排序是原地排序算法,只需要常量级别的额外空间。
  • 稳定性:选择排序不是稳定排序,因为在选择最小元素并交换时,可能会改变相同元素的相对顺序。
选择排序的优缺点:
  • 优点
    • 实现简单,易于理解。
    • 比冒泡排序交换操作次数少,因此当交换操作较昂贵时,选择排序可能比冒泡排序更优。
  • 缺点
    • 时间复杂度较高,对于大规模数据集不够高效。
    • 不稳定,可能会破坏相同元素的相对顺序。

以上呢,就是今天学习到的两种算法,跟大家简单的介绍一下,希望咱们各位能够早日成为大牛,然后顶峰相见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值