选择排序新手指南:看完这篇你也能搞定

嗨,大家好,我是小欧!
今天我要带大家探讨一个既简单又有趣的排序算法——选择排序。别担心,这不是上数学课,也不是高深的计算机科学,咱们用最接地气的语言把这个算法弄明白。

什么是选择排序?

选择排序,顾名思义,就是在一堆数据里挑挑拣拣,把最小(或者最大)的挑出来,放到该放的位置,直到所有数据都井井有序。想象一下你在市场买菜,选最好的苹果,先把最小的放到篮子里,再挑剩下的,直到你买完为止。

工作原理

  1. 在未排序的部分中找到最小(或最大)的元素。
  2. 将这个元素与未排序部分的第一个元素交换位置。
  3. 重复上述过程,直到所有元素都被排序。

简单来说,就是“找最小,换位置,再找下一个最小,继续换,直到排序完成”。

案例分析

为了让大家更容易理解,咱们用两个具体的例子来讲解选择排序的过程。

案例一:升序排序

假设我们有一组数据:[64, 25, 12, 22, 11],咱们一步一步把它排成升序的。

  1. 初始数组[64, 25, 12, 22, 11]
  2. 找到最小元素11,并与第一个元素64交换:[11, 25, 12, 22, 64]
  3. 剩余未排序部分[25, 12, 22, 64],找到最小元素12,与第一个元素25交换:[11, 12, 25, 22, 64]
  4. 继续找[25, 22, 64],找到最小元素22,与第一个元素25交换:[11, 12, 22, 25, 64]
  5. 最后一轮[25, 64],它们已经有序,不用再动。

最终的结果是:[11, 12, 22, 25, 64]

案例二:降序排序

当然,我们也可以用选择排序来排降序。还是用同样的数据:[64, 25, 12, 22, 11]

  1. 初始数组[64, 25, 12, 22, 11]
  2. 找到最大元素64,它已经在第一个位置,不用换。
  3. 剩余未排序部分[25, 12, 22, 11],找到最大元素25,与第一个元素交换:[64, 25, 12, 22, 11]
  4. 继续找[12, 22, 11],找到最大元素22,与第一个元素12交换:[64, 25, 22, 12, 11]
  5. 最后一轮[12, 11],找到最大元素12,它已经在第一个位置,不用动。

最终结果是:[64, 25, 22, 12, 11]

代码实现

接下来,咱们来看看用Java代码是怎么实现选择排序的,分别展示升序和降序排序。

升序排序

public class SelectionSort {
    public static void selectionSortAsc(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        selectionSortAsc(arr);
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

运行结果:

11 12 22 25 64 

降序排序

public class SelectionSort {
    public static void selectionSortDesc(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            int maxIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] > arr[maxIndex]) {
                    maxIndex = j;
                }
            }
            int temp = arr[maxIndex];
            arr[maxIndex] = arr[i];
            arr[i] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        selectionSortDesc(arr);
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

运行结果:

64 25 22 12 11 

选择排序的时间复杂度

选择排序的时间复杂度为O(n^2),也就是当数据量增大时,排序所需的时间会呈指数级增加。这是因为它需要进行两层嵌套循环,每个循环最多执行n次。不过好消息是,它的空间复杂度为O(1),因为它是一个原地排序算法,不需要额外的存储空间。

适用场景

虽然选择排序在性能上不如快速排序和归并排序,但它有自己的优势:

  • 数据量较小时,选择排序的实现非常简单直接。
  • 适合需要稳定排序结果的场合,比如学习和教学。
  • 作为初学者了解排序算法的入门选择,它非常直观。

总结

今天,我们通过简单易懂的语言和具体的例子,详细讲解了选择排序的原理。通过两个小案例展示了升序和降序排序的过程,并提供了相应的Java代码实现。希望通过这篇文章,大家能够对选择排序有一个清晰的理解,并能在实际编程中应用。
如果你有任何疑问或需要进一步的讲解,欢迎在评论区留言。谢谢大家的阅读,关注+订阅期待下一次的技术分享!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬行系

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值