数据结构-选择排序以及对它的优化

2023-10-26

  1. 选择排序
    八大排序算法之一的选择排序,它的原理是比较容易理解的。
    每一趟遍历都在后面元素中找到最小的元素(升序),记录它的下标,一趟走完后,如果记录的元素下标不等于这组元素第一个元素则进行交换。
    我们可以配合图来看:
    这里写图片描述

还另外加了升序和降序的仿函数,这样可以更加实用一些
下面是实现代码:

template<class T>
struct Less
{
    bool operator()(const T& s, const T& l)
    {
        return s < l;
    }
};
template<class T>
struct Greater
{
    bool operator()(const T&s, const T& l)
    {
        return s > l;
    }
};
using namespace std;
template<class T = int, class Compare = Greater<T>>
void SelectSort(T* arr,int size)
{
    Compare com;
    for (int i = 0; i < size - 1; i++)
    {
        int k = i;
        for (int j = i + 1; j < size; j++)
        {
            if (com(arr[k], arr[j]))
                k = j;
        }
        if (k != i)
            std::swap(arr[i], arr[k]);
    }
}
void SelectTest()
{
    int arr[] = { 3, 4, 1, 5, 2 };
    SelectSort(arr, sizeof(arr) / sizeof(arr[0]));
}
这样最基本的选择排序就出来了,但是仔细想想我们一次选一个最小的数进行交换,那我们为什么不能每趟遍历选出最大和最小的,最大的和最后交换,最小的和前面交换,这样效率会更高一些,这样想,于是对代码进行优化改良,就有了下面优化版本的选择排序。

2. 选择排序优化

using namespace std;
template<class T>
struct Less
{
    bool operator()(const T& s, const T& l)
    {
        return s < l;
    }
};
template<class T>
struct Greater
{
    bool operator()(ctonst T&s, const T& l)
    {
        return s > l;
    }
};

template<class T = int, class Compare = Greater<T>>

void SelectSort(T* arr, int size)
{
    Compare com;
    int left = 0;
    int right = size - 1;
    for (; left <= right;left++,right--)
    {
        int min = left;
        int max = right;
        for (int i = left; i <= right; i++)
        {
            if (com(arr[min],arr[i]))
                min = i;
            if (com(arr[i],arr[max]))
                max = i;
        }
        swap(arr[max], arr[right]);
        if (min == right)
            min = max;
        swap(arr[min], arr[left]);
    }
}
void SelectTest()
{
    int arr[] = { 3, 4, 1, 5, 2 };
    SelectSort(arr, sizeof(arr) / sizeof(arr[0]));
}

最后,分析一下选择排序的时间复杂度,选择排序的时间复杂度是O(n^2)。
因为需要选择,所以无论什么情况都是要把为排序序列完整的遍历一遍才可以,所以选择排序的时间复杂度最好的时候也是O(n^2)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-选择排序以及对它的优化 的相关文章

  • 常见国内镜像源地址

    常见国内镜像源地址 常见的pip后面的镜像源地址 常见国内镜像源地址 常见的pip后面的镜像源地址 清华大学 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun co
  • ABAP:ONCHANGEOF的坑

    以下文章来源于ABAPer孙亮 作者孙小亮 ABAPer孙亮 绝对 有用 实用 的ABAP与Excel 原创 干货 不定期发布 可加vx 286503700交流 1 7 背景 由于AT NEW field会判断field和它前面的所有字段

随机推荐

  • 靠营销出圈的拉面说,会是下一个黄太吉吗?

    乘着 宅经济 一人食 的东风 方便速食这一餐饮细分赛道愈发火热 CBNData发布的 2021方便速食行业洞察报告 数据显示 方便速食行业近年来规模增长稳健 预估国内市场规模超2500亿元 而线上市场近一年的增长率更是超过了70 广阔的市场
  • DataGrip汉化设置

    左上角file settings plugins搜chinese如下图搜索结果 选择第二个官方汉化插件安装即可
  • 构造函数的初始化列表

    构造函数初始化列表以一个冒号开始 接着是以逗号分隔的数据成员列表 每个数据成员后面跟一个放在括号中的初始化式 例如 include
  • 【科普】一分钟看懂WINDOWS系统、LINUX系统和苹果操作系统到底有什么区别?

    转自 首先 不管是WINDOWS操作系统 LINUX系统还是苹果操作系统 甚至包括操作系统的鼻祖UNIX操作系统 最早都是用C语言编写的 实际上UNIX操作系统和C语言都是由贝尔实验室的汤普森 Ken Thompson 和丹尼斯 里奇 De
  • RFC文档(中文翻译版本)

    RFC文档官方在线阅读地址 https tools ietf org rfc index 以下是部分中文翻译的文档连接 RFC文档目录 RFC1 主机软件 RFC2 主机软件 RFC3 文档规范 RFC4 网络时间表 RFC6 与 Bob
  • Jmeter导出测试报告

    不管是测接口还是性能 测试完毕之后我们总是希望有所产出 能看的更直观 Jmeter就提供了导出测试报告的功能 一起看看怎么玩 如果细心留意的话 会看到在启动jmeter时 dos窗口会有一行命令 实际上这个命令就阔以帮助我们导出测试报告 我
  • 强制Vue重新渲染组件的最佳方式(亲测完美解决问题)

    有时候 依赖 Vue 响应方式来更新数据是不够的 相反 我们需要手动重新渲染组件来更新数据 或者 我们可能只想抛开当前的DOM 重新开始 那么 如何让Vue以正确的方式重新呈现组件呢 强制 Vue 重新渲染组件的最佳方法是在组件上设置 ke
  • MySQL 使用两种方式清空表,删除表中的所有数据

    假设要删除book表中的所有数据 DELETE FROM book 或 TRUNCATE TABLE book 两者的区别在于 如果book表的主键Id设置为自增的整型 那么 第一次新建一条数据不指定Id Id自动赋值为1 如果使用Dele
  • 刷脸支付项目成本低是创业投资首选

    人工智能技术的改革 还可以说刷脸支付的应用开启了人工智能技术的改革 在以往的人工智能技术的应用而言还不是十分普及 而人工智能技术的在商业化的落地 对于全国店家而言还可以得到广泛的应用 随着各方从业人员的推广以及技术的不断更新 人工智能技术和
  • 打印杨辉三角

    要打印杨辉三角 我们首先要观察杨辉三角中数的规律 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 5 1 如图 我们可以把杨辉三角中前面的空格先省掉 观察数的规律 可以把这些数看做一个二维数组 1 二维数组第一列的
  • 一文了解 Redis

    Redis 简介 Redis Remote Dictionary Server 是一个开源的高性能键值对存储数据库 最初由 Salvatore Sanfilippo 开发 它在内存中存储数据 并提供了持久化功能 可以将数据保存到磁盘中 是一
  • 基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【一】

    基于 树莓派4 STM32H7 构建支持云端应用的嵌入式系统平台 一 一 想法概述 1 想法由来 2 系统架构 3 系统选型 4 开发语言 5 涉及到的框架 6 开发工具 7 功能实现 二 环境搭建 1 MCU开发环境 2 树莓派开发环境
  • 下载试用华秋DFM,让鹏老师恰口饭!

    赚W嘛 就大大方方的 不寒碜 华秋DFM简介 华秋DMF是一个PCB文件分析工具 可以在生产前分析设计好的PCB文件中可能存在的生产风险 从而提高PCB生产及后期贴片 装配的良品率 华秋DMF还集成及PCB下单功能 每个账号没月可免费在华秋
  • VMware虚拟机 Centos7网络配置 ping:www.baidu.com:未知的名称或服务 ping不通

    代码操作 右击打开终端 cd etc sysconfig network scripts ll ll less 看到第一行 rw r r 1 root root 279 11月 8 01 35 ifcfg ens33 vim ifcfg e
  • 【论文阅读】Ultrafast Local Outlier Detection from a Data Stream with Stationary Region Skipping

    论文阅读 Ultrafast Local Outlier Detection from a Data Stream with Stationary Region Skipping 论文来源 SIGKDD 2020 原文地址 https dl
  • docker部署redis实例

    docker部署redis实例 前言 本文只适合二次创建redis实例 在 1 电脑已经有虚拟机 2 虚拟机之前已经配置好了docker 3 虚拟机docker之前已经拉取过redis镜像 pull 4 通过上面第3步的镜像成功跑起过red
  • visual studio code搭建opencv环境

    visual studio code搭建OpenCV环境 前言 资源下载 软件安装与配置环境变量 安装 配置环境变量 生成MakeFiles 编译opencv vscode配置 参考链接 前言 前段时间我想学习opencv 由于我一直都习惯
  • 在windows下安装opencv+python

    上面是我的微信和QQ群 欢迎新朋友的加入 先安装好python 安装 opencv pip install opencv python 查看版本 import cv2 cv2 version 测试
  • windows10下面安装alphapose解决 ImportError : cannot import name ‘deform_conv_cuda‘

    0 环境 conda create n alphapose python 3 6 source activate alphapose conda install pytorch 1 1 0 torchvision 0 3 0 cudatoo
  • 数据结构-选择排序以及对它的优化

    选择排序 八大排序算法之一的选择排序 它的原理是比较容易理解的 每一趟遍历都在后面元素中找到最小的元素 升序 记录它的下标 一趟走完后 如果记录的元素下标不等于这组元素第一个元素则进行交换 我们可以配合图来看 还另外加了升序和降序的仿函数