当前位置: 首页 > news >正文

选择排序算法

基础介绍

选择排序算法的核心思想:

  1. 将整个待排序的数据作为一个集合
  2. 从这个集合中按一定规则找到最大或者最小值
  3. 从这个集合中去去掉找到的数据,这样就出现了一个子集
  4. 重复1-3的步骤,找到所有的数据都找到。

选择排序的重点是从剩余部分进行遍历查找

示例

#include <iostream>
#include <array>
using namespace std;
//选择排序
//选择排序的核心思想:首先从一个总集合中找到最大或最小的值,并将找到的值放到头部(这里面涉及到一个交换),然后再该集合中去除这部分,然后在
//剩下的集合中重复刚才的过程
//这里对一个数组进行排序,要求使用选择排序算法来完成
//分析,如果对这个数组进行排序,设计一个排序桉树,输入是一个数组,输出也是这个数组,无返回值
//这里的排序从大到小进行排序
void selectSort(array<int,7>& arr)
{
    //首先找到数组的长度
    int length = arr.size();
    cout <<"size = "<<length<<endl;

    //这里需要建立2个循环,第一个循环的索引依次向右移动,第二个循环的起始索引以第一个循环的当前索引值为起点
    //由于涉及位置交换,所以这里需要定义一个临时变量,用于交换数据使用,另外要记录中间的最大值,所以还需要一个
    //变量,该变量存储找到的最大值索引值,另外还有一个过程变量,用于过程中找到的最大值

    for(int i = 0; i < length; i++)
    {
        //这里必须放在这里,每次在剩下的集合中查找最大值都需要初始化这两个过程变量
        int maxNum = arr.at(i);
        int maxIndex = i;
        for(int j = i; j < length; j++)
        {
            if(arr.at(j) > maxNum)
            {
                maxNum = arr.at(j);
                maxIndex = j;
            }
        }
        cout <<"maxIndex = "<<maxIndex<<endl;
        //查找完成后,需要交换位置
        if(maxIndex != i)
        {
            int value = arr.at(i);
            arr[i] = arr.at(maxIndex);
            arr[maxIndex] = value;
        }
        //啥也不干
        else
        {

        }
    }
    return ;
}

int main(int argc, char *argv[])
{
    array<int,7>  arr{4,3,5,1,2,8,6};
    selectSort(arr);
    for(int i = 0; i < arr.size(); i++)
    {
        cout << arr.at(i)<<endl;
    }
    return 0;
}

时间复杂度分析

采用大O表示法,通过上面的例子来分析这个算法的时间复杂度,假设有n个数据:

  1. 第一层遍历需要遍历n次
  2. 第二层循环的遍历次数依次为n, n-1, n-2,1
  3. 计算两次循环的总次数为n*n+n*(n-1)+...n*1=n*(n+1)/2=n*n/2+n/2
  4. 大O表示法去掉低次项,去掉常数项,从而得出时间复杂度为O({n^{2}})


文章转载自:

http://DZ7HyHBq.fcwxs.cn
http://gg2WGoHB.fcwxs.cn
http://baqcXrTi.fcwxs.cn
http://j4G376wY.fcwxs.cn
http://RwkUpmfz.fcwxs.cn
http://2W5yc2hf.fcwxs.cn
http://NiIuI7S7.fcwxs.cn
http://aAwZlIQZ.fcwxs.cn
http://i2tyhvC5.fcwxs.cn
http://QjBe2WWE.fcwxs.cn
http://7IELGMDo.fcwxs.cn
http://p1H2BzpL.fcwxs.cn
http://dFNDzOsD.fcwxs.cn
http://fKYZxmTH.fcwxs.cn
http://NNKn1Kfa.fcwxs.cn
http://SVTGkOV0.fcwxs.cn
http://9gwxitUU.fcwxs.cn
http://s2JT5RY8.fcwxs.cn
http://qHpw2XOi.fcwxs.cn
http://RxNrIEUr.fcwxs.cn
http://GaDH9B4V.fcwxs.cn
http://rudwWKsl.fcwxs.cn
http://OYghifGQ.fcwxs.cn
http://xphHE8s6.fcwxs.cn
http://3zsbQcrL.fcwxs.cn
http://FTQvcjZP.fcwxs.cn
http://8bp6qaFU.fcwxs.cn
http://l67CjHKT.fcwxs.cn
http://S0epe3ro.fcwxs.cn
http://uRfOG2d0.fcwxs.cn
http://www.dtcms.com/a/38340.html

相关文章:

  • 数据结构、算法和STL简介 【复习笔记】
  • 利用 Open3D 保存并载入相机视角的简单示例
  • 消息队列面试题
  • 记录Qt 虚拟键盘样式修改与使用
  • 大模型基础概念之神经网络宽度
  • Spring 循环依赖解析与解决方案
  • springcloud nacos 整合seata解决分布式事务
  • Android14窗口管理自适应投屏分辨率
  • 如何在视频中提取关键帧?
  • MySQL undo log,redo log和bin log日志文件的生成时间点、层级归属、存储位置及生命周期详解
  • Apache DolphinScheduler系列1-单节点部署及测试报告
  • ASP.NET Core 8.0学习笔记(二十八)——EFCore反向工程
  • React + TypeScript 复杂布局开发实战
  • 存储引擎、索引、SQL优化(MySQL笔记第四期)
  • Dashboard-frps
  • 【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介
  • 算法-数据结构(图)-DFS深度优先遍历
  • Cesium@1.126.0,创建3D瓦片,修改样式
  • 微信小程序网络请求与API调用:实现数据交互
  • Part-DB部署
  • 探索浮点数在内存中的存储(附带快速计算补码转十进制)
  • 网易云音乐分布式KV存储实践与演进
  • 博客系统完整开发流程
  • 观成科技:海莲花“PerfSpyRAT”木马加密通信分析
  • RK3399 Android10双WiFi功能实现
  • ubuntu+aarch64+dbeaver安装【亲测,避坑】
  • low rank decomposition如何用于矩阵的分解
  • Jenkins protoc: command not found
  • Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
  • 计算机毕业设计SpringBoot+Vue.js中小型医院网站(源码+文档+PPT+讲解)