【数据结构】直接选择排序(你知道最不常用的排序算法有哪些吗?)

news2024/9/21 12:43:19

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:数据结构
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵
希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、基本思想
  • 二、传统算法思路
  • 三、传统代码实现
  • 四、优化版本思路
  • 五、优化版本代码实现
  • 六、特性总结

一、基本思想

在这里插入图片描述

基本思想:每一次从原数组的元素中选出一个最大/最小的元素,放在序列的起始位置(选最大还是最小看排的是升序还是降序),直至全部待排序的数据全部排完。

二、传统算法思路

以排列升序为例

  1. 在元素集合array[0]--array[n-1]中选择随机选择一个数据元素。假设array[0]是最小的(注意是假设)
  2. 然后再从元素集合array[1]--array[n-1]遍历,如果集合中还有元素比array[0]小,则更新。
  3. 重复上述步骤,直到集合剩余1个元素

三、传统代码实现

#include <stdio.h>

void Swap(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}

void select_sort(int a[], int n)
{
    // 1. 规划区间
    int l = 0, r = n - 1;

    // 5. 直到集合剩余一个元素为止
    while (l < r)
    {
        // 2. 假设最小值是a[0],下标是l = 0
        int Min = l;

        // 3. 遍历区间[l + 1, r]for (int i = l + 1; i <= r; i++)
        {
            if (a[i] < a[Min])
            {
                // 更新最小值下标
                Min = i;
            }
        }

        // 4. 当循环结束后,直接让下标为l和下标为Min直接交换
        Swap(&a[l], &a[Min]);

        l++;
    }
}

int main()
{
    int a[] = {10, 1, 6, 9, 4, 7, 2, 3, 8, 5};
    int aSize = sizeof(a) / sizeof(a[0]);

    select_sort(a, aSize);

    for (int i = 0; i < aSize; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

【结果展示】

在这里插入图片描述

四、优化版本思路

  1. 定义leftright分别表示数组的头和尾
  2. 每次遍历left~right区间里的元素,找到最小的数与left为下标的元素进行交换;同理,找到最大的元素与以right为下标的元素进行交换,完成交换后分别缩小leftright之间的范围
  3. 重复上述步骤,直到集合剩余一个元素为止

注意:这里会有一个大家忽略的问题:重叠问题

在这里插入图片描述

如上图所示,a[l] a[MinIdx]交换后,此时maxIdx指向的元素就是最小值了,再对a[r]a[MaxIdx]就会出错,因此,再次交换之前需要将MaxIdx指向MinIdx

五、优化版本代码实现

#include <stdio.h>

void Swap(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}

void select_sort(int a[], int n)
{
    // 1. 规定区间
    int l = 0, r = n - 1;

    // 直到集合剩余一个元素为止
    while (l < r)
    {
        // 2. 假设最大值和最小值都是下标为0的元素
        int MinIdx = l, MaxIdx = l;

        // 3. 遍历[l + 1, r]
        for (int i = l + 1; i <= r; i++)
        {
            // 分别更新最大值和最小值的下标
            if (a[i] > a[MaxIdx])
            {
                MaxIdx = i;
            }
            if (a[i] < a[MinIdx])
            {
                MinIdx = i;
            }
        }
        // 当for循环结束后,说明已经找到区间内的最大值和最小值
        // 直接分别和下标为l、r交换即可
        Swap(&a[l], &a[MinIdx]);

        // 可能存在left和Max重叠
        if (l == MaxIdx)
        {
            MaxIdx = MinIdx;
        }
        Swap(&a[r], &a[MaxIdx]);

        // 更新区间
        l++;
        r--;
    }
}

int main()
{
    int a[] = {10, 1, 6, 9, 4, 7, 2, 3, 8, 5};
    int aSize = sizeof(a) / sizeof(a[0]);

    select_sort(a, aSize);

    for (int i = 0; i < aSize; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

【结果展示】

在这里插入图片描述

六、特性总结

  • 时间复杂度

首先先来分析传统版本,每次排好一个数是n - 1次,第二个数是n - 2次…,是一个等差数列。因此时间复杂度是O(N2)

同理的,优化版本排好一个数是n - 2次,第二个就是n - 4次…,同样也是一个等差数列。因此时间复杂度还是O(N2)

总之,直接选择排序效率极低,实际中很少使用。

  • 空间复杂度:O(1)
  • 稳定性:不稳定

那么如果对一个有序序列进行选择排序(使用优化版),它的效率又会是如何呢?我们可以来测试一下

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void Swap(int* x, int* y)
{
    int t = *x;
    *x = *y;
    *y = t;
}

// 优化版
void select_sort(int a[], int n)
{
    // 1. 规定区间
    int l = 0, r = n - 1;

    // 直到集合剩余一个元素为止
    while (l < r)
    {
        // 2. 假设最大值和最小值都是下标为0的元素
        int MinIdx = l, MaxIdx = l;

        // 3. 遍历[l + 1, r]
        for (int i = l + 1; i <= r; i++)
        {
            // 分别更新最大值和最小值的下标
            if (a[i] > a[MaxIdx])
            {
                MaxIdx = i;
            }
            if (a[i] < a[MinIdx])
            {
                MinIdx = i;
            }
        }
        // 当for循环结束后,说明已经找到区间内的最大值和最小值
        // 直接分别和下标为l、r交换即可
        Swap(&a[l], &a[MinIdx]);

        // 可能存在left和Max重叠
        if (l == MaxIdx)
        {
            MaxIdx = MinIdx;
        }
        Swap(&a[r], &a[MaxIdx]);

        // 更新区间
        l++;
        r--;
    }
}

int main()
{
    srand(time(0));
    const int N = 100000; // 十万测试数据
    int* a1 = (int*)malloc(sizeof(int) * N);

    for (int i = 0; i < N; i++)
    {
        a1[i] = rand();
    }
    // 先排好序
    select_sort(a1, N);

    int begin = clock();
    select_sort(a1, N);
    int end = clock();

    printf("快速选择排序:%d\n", end - begin);
    return 0;
}

【运行结果】

在这里插入图片描述

需要差不多9秒

因此,直接选择排序是一个鸡肋的排序算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1212326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023云栖】黄博远:阿里云人工智能平台PAI年度发布

本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;黄博远 | 阿里云计算平台事业部资深产品专家、阿里云人工智能平台PAI产品负责人 演讲主题&#xff1a;阿里云人工智能平台PAI年度发布 AIGC是我们这个时代的新机遇 今年云栖大…

单相过压继电器DVR-G-100-1 0~500V AC/DC220V 导轨安装

系列型号 DVR-G-100-1X3数字式过压继电器&#xff1b; DVR-G-100-3三相过压继电器&#xff1b; DVR(H)-G-100-1单相过压继电器&#xff1b; DVR-Q-100-3三相欠压继电器&#xff1b; DVR(H)-Q-100-3三相欠压继电器 一、用途 主要应用于电机、变压器等主设备以及输配电系统的继…

人工智能与大数据:驱动现代业务转型的双引擎

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和大数据已成为驱动业务和技术创新的关键力量。它们的结合不仅重塑了传统行业&#xff0c;也催生了新的商业模式和服务方式。 AI与大数据在零售行业的应用 在零售行业&#xff0c;AI和大数据的应用已经成为提…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning

昇科能源、清华大学欧阳明高院士团队等的最新研究成果《动态深度学习实现锂离子电池异常检测》&#xff0c;用已经处理的整车充电段数据&#xff0c;分析车辆当前或近期是否存在故障。 思想步骤&#xff1a; 用正常电池的充电片段数据构造训练集&#xff0c;用如下的方式构造…

重生奇迹mu圣导师加点

重生奇迹mu圣导师加点&#xff1a;要攻击高可以加力量&#xff0c;平衡系建议加点力量600~800&#xff0c;智力200~400&#xff0c;敏够装备要求&#xff0c;统帅1000&#xff0c;其余加体力。 圣导师靠加力量培养高攻圣导师不现实&#xff0c;建议玩家练魔&#xff0c;低级圣…

【随手记录】Llama Tutorial 大语言模型实践 手把手系列带实践源码

这个tutorial的契机是yy突然看到了一个workshop 所以类似于一周大作业的形式&#xff0c;输入command输出使用了自动驾驶哪些模块&#xff0c;代码在这里 所以就干一干&#xff0c;顺便写一个tutorial给大家参考和教程 引申更多的应用 参考资料&#xff1a; https://github.c…

【软考篇】中级软件设计师 第三部分(二)

中级软件设计师 第三部分&#xff08;二&#xff09; 二十四. 概念设计阶段24.1 E-R模式24.2 E-R图 二十五. 网络和多媒体25.1 计算机网络分类25.2 OSI/RM参考模型25.3 网络互联硬件25.4 TCP/IP分层模型 二十六. IP地址26.1 子网划分26.2 特殊IP26.3 IPv626.4 冲突与和广播域26…

使用html2canvas插件进行页面截屏

使用纯html实现过程 <!DOCTYPE html> <html><head><title>使用html2canvas生成网页截图</title><script src"https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script> </head><body><h1>…

jQuery使用echarts循环插入图表

目录 jQuery动态循环插入echarts图表 y轴显示最大值和最小值 x轴只显示两个值&#xff0c;开始日期和结束日期 jQuery动态循环插入echarts图表 html .center_img_list 是我们循环数据的地方 <div class"center_img shadow"><div class"center_img_b…

python_pycharm安装与jihuo

目录 环境&#xff1a; 安装包与jihuo文件&#xff1a; 安装python3.8.10 安装pycharm jihuo pycharm 概述 过程 jihuo 相关文件 环境&#xff1a; window11 python3.8.10 pycharm-professional-2019.1.3 安装包与jihuo文件&#xff1a; 安装python3.8.10 安装pyc…

算法通关村——归并排序

归并排序 1、归并排序原理 ​ 归并排序是一种很经典的分治策略。 ​ 归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干小的数组&#xff0c;分成几个比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法。将一个大的问题分解成一些小的问题分别求解&#xff…

mask-rcnn原理与实战

一、Mask R-CNN是什么&#xff0c;可以做哪些任务&#xff1f; Mask R-CNN是一个实例分割&#xff08;Instance segmentation&#xff09;算法&#xff0c;可以用来做“目标检测”、“目标实例分割”、“目标关键点检测”。 1. 实例分割&#xff08;Instance segmentation&am…

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

Python循环的技巧和注意事项

在Python中&#xff0c;主要使用for循环和while循环进行迭代。为了更有效的使用循环&#xff0c;避免一些常见的陷阱&#xff0c;总结了一些关于使用循环的注意事项。 1. 避免无限循环 在while循环中&#xff0c;程序会一直执行循环体&#xff0c;直到条件不再满足&#xff0c…

2023年05月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有列表L=[‘UK’,‘china’,‘lili’,“张三”],print(L[-2])的结果是?( ) A: UK B: ‘lili’,‘张三’ C: lili D: ‘UK’,‘china’,‘lili’ 答案:C 列表元素定位 第2题 …

【VSCode】配置C/C++开发环境教程(Windows系统)

下载和配置MinGW编译器 首先&#xff0c;我们需要下载并配置MinGW编译器。 下载MinGW编译器&#xff0c;并将其放置在一个不含空格和中文字符的目录下。 配置环境变量PATH 打开控制面板。可以通过在Windows搜索栏中输入"控制面板"来找到它。 在控制面板中&#xf…

Apache Pulsar 技术系列 - 基于 Pulsar 的海量 DB 数据采集和分拣

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。本文是 Pulsar 技术系列中的一篇&#xff0c;主要介绍 Pulsar 在海量DB Binlog 增量数据采集、分拣场景下的应用。 前言…

电视剧剪辑,微课制作神器Camtasia的干货介绍,建议收藏。

最近无论是b站&#xff0c;抖音&#xff0c;快手等视频软件中都有不少微课视频、电视剧解说横空出世&#xff0c;通过这些“热度”带来的收益也是无法估量的&#xff0c;很多自媒体博主月入上万惹人羡慕。 不少朋友也想在这股短视频洪流中分一碗羹&#xff0c;但又苦于技术跟不…

大模型架构创新已死?

金磊 白交 发自 凹非寺 量子位 | 公众号 QbitAI 一场围绕大模型自研和创新的讨论&#xff0c;这两天在技术圈里炸了锅。 起初&#xff0c;前阿里技术VP贾扬清&#xff0c;盆友圈爆料吐槽&#xff1a;有大厂新模型就是LLaMA架构&#xff0c;但为了表示不同&#xff0c;通过改变…