简单选择排序(Simple Selection Sort)

简介: 算法介绍算法描述动图演示算法分析代码实现算法优化参考

算法介绍


     简单选择排序的工作方式突出"选择"二字,每次从待排序数据中选择符合条件的元素放在已排序元素末尾。对于少量元素的排序,简单选择排序是一个有效的算法。


算法描述


     第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。


动图演示


20210515135226164.gif



算法分析

 时间复杂度:O(N2)


 空间复杂度:O(1)


 稳定性:不稳定


代码实现

// C++
void selectionSort(int a[], int length) {
  for (int i = 0; i < length - 1; ++i) {  // 遍历序列
      int minIndex = i;  // 记录最小元素位置
        // 遍历无序序列寻找最小元素
        for (int j = i + 1; j < length; ++j) {
            if (a[j] < a[minIndex]) {  // 更新最小元素下标
                minIndex = j;
            }
        }
        // 将最小值放到已排序序列的末尾
        int temp = a[i];
        a[i] = a[minIndex];
        a[minIndex] = temp;
    }
}


算法优化


    上面代码一次遍历只是找出未排序序列中的最小值,其实我们可以在遍历过程中同时找出最小值和最大值,并把每次找出的最大值按顺序放到每次排列数据的末尾。时间复杂度还是 O(N^2) ,只相对前面的减少了一半遍历次数。


// C++
void selectionSort(int a[], int length) {
    int left = 0;  // 标记未排序序列左边界
    int right = length - 1;  // 标记未排序序列右边界
    while (left < right) {  // 遍历未排序序列
        int minIndex = left;  // 记录最小元素位置
        int maxIndex = left;  // 记录最大元素位置
        // 遍历无序序列寻找最小和最大元素
        for (int i = left + 1; i <= right; ++i) {
            if (a[i] < a[minIndex]) {  // 更新最小元素下标
                minIndex = i;
            }
            if (a[i] > a[maxIndex]) {  // 更新最大元素下标
                maxIndex = i;
            }
        }
        // 将最小值放到已排序序列的左末尾
        int temp = a[left];
        a[left] = a[minIndex];
        a[minIndex] = temp;
        // 处理最大值为a[left]的特殊情况
        if (maxIndex == left) {
            maxIndex = minIndex;
        }
        // 将最大值放到已排序序列的右末尾
        temp = a[right];
        a[right] = a[maxIndex];
        a[maxIndex] = temp;
  // 修改未排序序列范围
        ++left;
        --right;
    }
// 将最小值放到已排序序列的左末尾
        int temp = a[left];
        a[left] = a[minIndex];
        a[minIndex] = temp;
        // 处理最大值为a[left]的特殊情况
        if (maxIndex == left) {
            maxIndex = minIndex;
        }
        // 将最大值放到已排序序列的右末尾
        temp = a[right];
        a[right] = a[maxIndex];
        a[maxIndex] = temp;
  // 修改未排序序列范围
        ++left;
        --right;
    }
// 将最小值放到已排序序列的左末尾
        int temp = a[left];
        a[left] = a[minIndex];
        a[minIndex] = temp;
        // 处理最大值为a[left]的特殊情况
        if (maxIndex == left) {
            maxIndex = minIndex;
        }
        // 将最大值放到已排序序列的右末尾
        temp = a[right];
        a[right] = a[maxIndex];
        a[maxIndex] = temp;
  // 修改未排序序列范围
        ++left;
        --right;
    }

   

参考


数据结构与算法分析(Java语言描述)

数据结构(C语言版)

————————————————

版权声明:本文为CSDN博主「Acx7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Acx77/article/details/116847080

相关文章
|
存储 安全 网络安全
工欲善其事必先利其器,IT工作电脑更要维护好
工欲善其事必先利其器,IT工作电脑更要维护好
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
510 1
|
存储 机器学习/深度学习 监控
网络安全之认识托管威胁检测与响应(MDR)
随着数字化转型加速,企业的IT环境日益复杂,面临的网络安全威胁也在不断增加。传统的防御措施已经无法有效应对新型威胁,而且很多企业缺乏专业的网络安全团队和技术手段,导致大量的安全事件未能及时被发现和处理。 在这种背景下,托管威胁检测响应服务(MDR)应运而生。MDR能够利用现代安全运营中心的技术和专业人员,为客户提供全天候的安全监测和快速响应,从而缩短威胁发现和响应之间的窗口期,降低风险并减轻安全运营压力。
796 1
|
SQL 关系型数据库 MySQL
|
算法 Java
红黑树(下)完整删除过程
红黑树一般用在较为底层的地方作为保证效率的数据结构, 且红黑树的删除算法特别复杂!了解即可,手写出的难度较大。 对于删除算法,很多书上没有提及,或者写的很混乱。 全网亦没有一篇文章通俗易懂的讲清楚了其中过程, 此文也是参考了几篇大牛的博文,部分为笔者原创,部分为引用整合。 红黑树的删除其实就是基于二叉搜索树的删除上加入一个调色过程。 在弄清楚红黑树的删除操作之前,需要明白二叉搜索树的删除方法。 首先要明白几个概念:
499 0
|
移动开发 开发框架 JavaScript
vue常用组件库
vue常用组件库
682 0
|
安全 Windows
HTTP协议栈远程代码执行漏洞(CVE-2022-21907)
HTTP协议栈远程代码执行漏洞(CVE-2022-21907)
650 0
HTTP协议栈远程代码执行漏洞(CVE-2022-21907)
|
小程序 JavaScript API
微信小程序如何更换头像
微信小程序如何更换头像
682 0
|
存储 监控 Linux
借助gopsutil库,获取机器相关信息
借助gopsutil库,获取机器相关信息
287 0

热门文章

最新文章