码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 排序5:直接选择排序


    目录

    排序思想:

    演示图:

    代码实现

    总结:


    排序思想:

    · 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素
    · 若它不是这组元素中的最后一个 ( 第一个 )元素,则将它与这组元素中的最后一个(第一个)    元素交换
    · 在剩余的 array[i]--array[n-2] ( array[i+1]--array[n-1] )集合中,重复上述步骤,直到集合剩余 1 个元素

    演示图:

      

    代码实现

    单趟思路:

    设置四个 int 类型数据 mini 、maxi 、begin、end 记录这一趟中所遇到的最小值与最大值以及开头和结尾的下标。遍历一遍找到所对应的值,交换 mini 和 begin  以及 maxi 和 end 对应的数据的值。

    分析:如果第一个是最大值是在begin的位置,在 mini 和 begin 交换时被换走之后但是maxi仍然指向怎么办?

    很简单,我们只需要做出以下操作,将maxi改正到指向正确的值上即可。

    1. if (maxi == begin)
    2. {
    3. maxi = mini;
    4. }

    代码:

    1. int begin = 0, end = n - 1;
    2. int mini = begin, maxi = begin;
    3. for (int i = begin + 1; i <= end; ++i)
    4. {
    5. if (a[i] > a[maxi])
    6. {
    7. maxi = i;
    8. }
    9. if (a[i] < a[mini])
    10. {
    11. mini = i;
    12. }
    13. }
    14. Swap(&a[mini], &a[begin]);
    15. //避免了如果第一个数最大,会被换走,但是maxi还指向第一个数
    16. if (maxi == begin)
    17. {
    18. maxi = mini;
    19. }
    20. Swap(&a[maxi], &a[end]);
    21. ++begin;
    22. --end;

    整轮实现:加上循环即可,我们只需要让 begin < end 的时候进行循环就可以走完整轮了。

    代码:

    1. void SelectSort(int* a, int n)
    2. {
    3. int begin = 0, end = n - 1;
    4. while (begin < end)
    5. {
    6. int mini = begin, maxi = begin;
    7. for (int i = begin + 1; i <= end; ++i)
    8. {
    9. if (a[i] > a[maxi])
    10. {
    11. maxi = i;
    12. }
    13. if (a[i] < a[mini])
    14. {
    15. mini = i;
    16. }
    17. }
    18. Swap(&a[mini], &a[begin]);
    19. //避免了如果第一个数最大,会被换走,但是maxi还指向第一个数
    20. if (maxi == begin)
    21. {
    22. maxi = mini;
    23. }
    24. Swap(&a[maxi], &a[end]);
    25. ++begin;
    26. --end;
    27. }
    28. }

      

    总结:

    1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。
        因为就算是大致有序了,仍然需要走完全过程,时间复杂度任何情况下都是O(N^2)。
    2. 时间复杂度: O(N^2)
    3. 空间复杂度: O(1)
    4. 稳定性:不稳定
  • 相关阅读:
    蓝桥集训之木棒
    设计模式学习(十二):享元模式
    基于Java毕业设计影音娱乐销售管理系统源码+系统+mysql+lw文档+部署软件
    国网云(华为组件)使用
    Qt5开发及实例V2.0-第一章Qt概述及Qt5的安装
    y53.第三章 Kubernetes从入门到精通 -- ingress(二六)
    开发框架DevExpress XAF - Entity Framework Core 8支持.NET 8性能基准
    72-Java的选择排序、二分查找、Lambda表达式
    devops-5-jenkins
    痞子衡嵌入式:RT-MFB - 一种灵活的i.MXRT下多串行NOR Flash型号选择的量产方案
  • 原文地址:https://blog.csdn.net/qq_65139309/article/details/127617125
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号