码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 选择排序超详细讲解C语言


    文章目录

    • 算法步骤
    • 动图演示
    • 静图演示
    • 代码实现
      • 普通
      • 升级
    • 复杂度、稳定性分析

    选择排序是一种简单直观的排序算法,无论数据是否有序,该排序的时间复杂度恒为 O ( N 2 ) O(N^{2}) O(N2),所以用该排序时,数据量越小越好。

    算法步骤

    首先在未排序序列中找到最小的(升序)元素,放在未排序序列的起始位置,然后再从剩下的未排序序列中找到最小的(升序)元素,放在未排序序列的起始位置,以此类推。

    动图演示

    img

    静图演示

    image-20220828153009022

    代码实现

    普通

    void SelectSort(int* a, int n){
        for(int i = 0; i < n - 1; i++){
          	//在未排序序列中找最小的元素
            int minIndex = i;
            for(int j = i + 1; j < n; j++){
                if(a[minIndex] > a[j]){
                    minIndex = j;//minIndex始终是最小元素的下标
                }
            }
            Swap(&a[minIndex], &a[i]);//将最小元素和首元素交换
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    升级

    上面的是每次循环只找一个最小的,将最小的放首位后,序列向右收缩;

    而现在的升级版本是每次循环找一个最小的和一个最大的,将最小的放首位,最大的放末位,序列向中间收缩。

    然后

    void SelectSort(int* a, int n){
        int left = 0;
        int right = n - 1;
        while(left < right){
            int minIndex = left;
            int maxIndex = left;
            for(int i = left + 1; i <= right; i++){
                if(a[minIndex] > a[i]){
                    minIndex = i;
                }
                if(a[maxIndex < a[i]]){
                    maxIndex = i;
                }
            }
            Swap(&a[minIndex], &a[left]);
            if(maxIndex == left){
                maxIndex = minIndex;
            }
            Swap(&a[maxIndex], &a[right]);
            left++;
            right--;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    复杂度、稳定性分析

    1. 时间复杂度

      假设有N个数据

      不论数据是否有序,在排第1个数据时必定会比较N-1次,排第2个数据时必定会比较N-2次,所以总的比较次数为 1 + 2 + 3 + . . . + ( N − 1 ) 1 + 2 + 3+...+(N-1) 1+2+3+...+(N−1),等差数列求和,结果为 N 2 / 2 N^{2}/2 N2/2,时间复杂度为 O ( N 2 ) O(N^{2}) O(N2)。

    2. 空间复杂度

      仅仅使用了常数个辅助单元,空间复杂度是O(1);

    3. 稳定性

      举个例子,序列6 8 6 2 7, 第一遍选择,第一个6会和2交换,那么原序列中2个6的相对前后顺序就被破坏了,

      所以是不稳定的。

  • 相关阅读:
    NodeMCU ESP8266硬件开发板的熟悉
    【工具】创客贴会员|创客贴截止2024年6月所有AI功能效果实测(热门推荐和图片编辑部分)
    javaweb入门级操作教学,tomcal的使用
    [CVPR2020]Learning to Cartoonize Using White-box Cartoon Representations
    [附源码]java毕业设计生产型企业员工管理系统
    Java基础语法
    Vue3 动态组件 component:is= 失效
    Vue 组件之间的通信
    Linux常用命令
    OpenCV——图像分块局部阈值二值化
  • 原文地址:https://blog.csdn.net/qq_67569905/article/details/126574333
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号