【算法系列 | 3】深入解析排序算法之——选择排序

这篇具有很好参考价值的文章主要介绍了【算法系列 | 3】深入解析排序算法之——选择排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法系列 | 3】深入解析排序算法之——选择排序

序言

你只管努力,其他交给时间,时间会证明一切。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。

我们一起努力,成为更好的自己!

今天第3讲,讲一下排序算法的选择排序(Selection Sort)

1 基础介绍

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。

以下是一些常见的排序算法:

  1. 冒泡排序(Bubble Sort)

  2. 插入排序(Insertion Sort)

  3. 选择排序(Selection Sort)

  4. 归并排序(Merge Sort)

  5. 快速排序(Quick Sort)

  6. 堆排序(Heap Sort)

一、选择排序介绍

原理介绍

选择排序(Selection Sort)是一种简单的排序算法,其基本原理是在未排序的元素中找到最小(或最大)的元素,然后将其放在已排序的序列的末尾。重复这个过程,直到所有元素都被排序完毕。

具体来说,选择排序的实现过程如下:

  1. 遍历整个待排序的数组,从第一个元素开始。
  2. 在未排序的部分中,找到最小(或最大)的元素,并将其与第一个元素交换位置。
  3. 接着从第二个元素开始,重复步骤2,直到所有元素都被排序

下面是一个示例,展示了选择排序如何对一个数组进行排序:

原始数组:[5, 1, 9, 3, 7]

第一轮排序:
未排序部分:[5, 1, 9, 3, 7]
当前最小值:1
交换位置后:[1, 5, 9, 3, 7]

第二轮排序:
未排序部分:[5, 9, 3, 7]
当前最小值:3
交换位置后:[1, 3, 9, 5, 7]

第三轮排序:
未排序部分:[9, 5, 7]
当前最小值:5
交换位置后:[1, 3, 5, 9, 7]

第四轮排序:
未排序部分:[9, 7]
当前最小值:7
交换位置后:[1, 3, 5, 7, 9]

第五轮排序:
未排序部分:[9]
当前最小值:9
交换位置后:[1, 3, 5, 7, 9]

经过五轮排序后,数组已经被排序完毕。

复杂度 

虽然选择排序的思路简单,但是它的时间复杂度为O(n^2),其中n是数组中元素的数量。

因此,对于大规模的数据集,选择排序的性能会受到很大的影响,不如其他高效的排序算法。

空间复杂度为O(1),即不需要额外的空间来存储排序结果。

在排序过程中,只需要进行元素之间的比较和交换操作,不需要使用辅助的数据结构。

因此,选择排序是一种原地排序算法,它可以在原始数组上进行排序,不需要使用额外的空间。

这也是选择排序在一些特定场景下仍然有用的原因之一。

使用场景

选择排序,由于它简单性和实现的易用性,常常被用于教学和学习排序算法的入门课程中。但是在实际应用中,由于其时间复杂度较高,选择排序并不是最优秀的排序算法

尽管如此,它仍然有一些适用场景,例如:

  1. 对于非常小的数据集,选择排序的性能可能并不比其他高效排序算法差多少。在这种情况下,选择排序的简单性和易用性可能更加重要。

  2. 在一些特定场景下,需要对数据进行部分排序或者仅需要找到最小(或最大)的k个元素。在这种情况下,可以使用选择排序的变体——选择部分排序(Select Partial Sort)算法,通过一些优化策略可以提高其性能。

  3. 由于选择排序的实现过程中只涉及到元素之间的比较和交换操作,不需要使用额外的空间,因此可以在内存受限的环境下使用。

总之,选择排序虽然并不是最优秀的排序算法,但是在一些特定场景下仍然有其适用性和价值。

二、代码实现

2.1 Python 实现

下面是使用Python实现选择排序的代码:

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

使用了Python内置的交换语法a, b = b, a来进行元素的交换,可以使代码更加简洁易读。

下面是使用Python实现选择部分排序的代码,其中k表示要找到的最小元素的个数:

def select_partial_sort(arr, k):
    n = len(arr)
    for i in range(k):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr[:k]

这里的实现和普通的选择排序略有不同,每轮排序只找到一个最小元素,然后将其放在已排序部分的末尾。最终返回前k个元素即为最小的k个元素。

2.2Java实现

下面是使用Java实现选择排序的代码:

public class SelectionSortExample {
    public static void main(String[] args) {
        int[] arr = { 5, 1, 9, 3, 7 };
        selectionSort(arr);
        System.out.println(Arrays.toString(arr));
    }

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

这个代码和前面Python的实现类似,都是使用两重循环,外层循环遍历整个数组,内层循环找到未排序部分中的最小元素,并将其放在已排序部分的末尾。

这个示例中,

  1. 首先定义了一个整型数组arr
  2. 然后调用selectionSort方法对其进行排序
  3. 最后,使用Arrays.toString方法将排序结果打印出来

selectionSort方法中,实现了选择排序的核心逻辑,使用两重循环遍历数组,找到未排序部分中的最小元素,并将其交换到已排序部分的末尾。

最终,排序结果存储在原始数组中,不需要使用额外的空间。

执行该示例的输出结果为:[1, 3, 5, 7, 9],即排序后的整型数组。

图书推荐

图书列表:

  • python分布式机器学习
  • Python Web 深度学习
  • Pandas1.X 实例讲解
  • Python 从入门到精通
  • mysql 数据库基础与实战应用

 python分布式机器学习

【算法系列 | 3】深入解析排序算法之——选择排序

Python Web 深度学习

 【算法系列 | 3】深入解析排序算法之——选择排序

Pandas1.X 实例讲解

【算法系列 | 3】深入解析排序算法之——选择排序

Python 从入门到精通

【算法系列 | 3】深入解析排序算法之——选择排序

mysql 数据库基础与实战应用

 618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多个 IT 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东点击链接 IT BOOK 多得,查看详情吧!

活动链接:IT BOOK

【算法系列 | 3】深入解析排序算法之——选择排序

参与方式 

图书数量:本次送出 3 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-06-13 12:00:00

抽奖方式:

  • 评论区随机挑选小伙伴!

留言内容,以下方式都可以:

  • 文章高质量评论+【你想要的书名】
  • 投资自己是人一生中最重要的投资+【你想要的书名】

参与方式:关注博主、点赞、收藏,评论区留言 

中奖名单 

🍓🍓 获奖名单🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-06-13 下午
 文章来源地址https://www.toymoban.com/news/detail-479943.html

到了这里,关于【算法系列 | 3】深入解析排序算法之——选择排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法系列 | 2】深入解析排序算法之——插入排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(26)
  • 【算法系列 | 1】深入解析排序算法之——冒泡排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(43)
  • 【算法系列 | 6】深入解析排序算法之——堆排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(31)
  • JavaScript排序算法大解密 - 冒泡、选择、插入、快速排序全解析

    📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 📢 Krpano专栏:想学VUE的,冲这里 🔔 上述专栏,都在不定期持续更新中!!!! 目录 ✨ 前言 冒泡排序 选择排序 插入排序 快速排序 ✨ 结语

    2024年01月17日
    浏览(39)
  • 排序算法中的冒泡和选择排序详解(持续更新系列)

    本系列文章为Java基础入门内容,致力于为大家详细讲解学习Java中的一些难点、常见点等,内容由浅入深。 文末有全文重点总结及配套视频资料,更多相关技术问题欢迎和我们一起交流讨论!更多学习资料可点这里获取 我们要想成为一个优秀的程序员,其实非常关键的一点就

    2024年02月07日
    浏览(30)
  • 【C语言】解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

    本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 冒泡排序算法是一种简单且常用的排序算法。它通过重复地交换相邻的元

    2024年02月13日
    浏览(29)
  • 【算法系列 | 8】深入解析查找算法之—二分查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第8讲,讲一下查找算法的二分查找 查找算法是很常见的一类问题,主

    2024年02月07日
    浏览(45)
  • 【算法系列 | 11】深入解析查找算法之—插值查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第11讲,讲一下查找算法的—插值查找算法 查找算法是计算机科学中的

    2024年02月03日
    浏览(36)
  • 【算法系列 | 10】深入解析查找算法之—线性查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第10讲,讲一下查找算法的线性查找算法 查找算法是计算机科学中的一

    2024年02月08日
    浏览(27)
  • 【算法系列 | 9】深入解析查找算法之—哈希表查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第9讲,讲一下查找算法的哈希表查找 查找算法是计算机科学中的一类

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包