【数据结构】八大排序之简单选择排序算法

举报
修修修也 发表于 2024/09/30 16:37:47 2024/09/30
【摘要】 🦄个人主页:修修修也 🎏所属专栏:数据 结 构 ⚙️操作环境:Visual Studio 2022​编辑目录一. 简单选择 排序 简 介及思路 二. 简单选择 排序的代 码实现 三. 简单选择 排序的 优 化 四. 简单选择 排序的 时间 复 杂 度分析 结语 一.简单选择排序简介及思路简单选择排序算法(Simple Selection Sort)是一种简单直观的选择排序算法.它的基本操...

🦄个人主:修修修也

🎏所属专栏:数据

⚙️操作:Visual Studio 2022

​编辑


一. 简单选择 排序 介及思路

二. 简单选择 排序的代 码实现

三. 简单选择 排序的

四. 简单选择 排序的 时间 度分析

结语


一.简单选择排序介及思路

简单选择排序算法(Simple Selection Sort)是一种简单直观的选择排序算法.

它的基本操作是:

每一次通n-i次关的比,从n-i+1个数据中出关字最小(大)的数据,并和第i(1≤i≤n)个数据交

重复n-1次上述操作,直到全部待排序的数据元素排完.

算法动图演示如下:

​编辑


二.简单选择排序的代码实现

算法实现:(以升序)

1. 在元素集合arr[i]~arr[n-1]中选择键码最小(大)的数据元素.

2. 若它不是这组元素中的第一个(最后一个)元素,将它与这组元素中的第一个(最后一个)元素交.

3. 在剩余的arr[i+1]~arr[n-1](arr[i]~arr[n-2])集合中,重复上述步,直到集合剩余一个元素.

清楚了实现步骤后,代码的实现就比较简单了,代码如下:

//交换函数

void Swap(int* a, int* b)

{

    int tmp = *a;

    *a = *b;

    *b = tmp;

}




//直接选则排序(升序

void SelectSort(int* a, int n)

{

    int left = 0;




    while (left < n - 1)

    {

        int mini = left;

        for (int i = left + 1; i <= n - 1; i++)

        {

            if (a[i] < a[mini])

            {

                mini = i;

            }

        }

        Swap(&a[left], &a[mini]);

        left++;

    }

}


三.简单选择排序的

我们在设计简单选择排序时,思路往往都是每趟循环选出一个最大或最小的将其放在相应位置上,那么其实我们可不可以一趟直接将最大和最小的两个元素都出来呢?

依照这个思路,我们对简单选择排序进行优化,使其一趟就可以将最大的元素和最小的元素都出来交到相的位置上,综上,代码实现如下:

//交换

void Swap(int* a, int* b)

{

    int tmp = *a;

    *a = *b;

    *b = tmp;

}




//选择排序(直接选择排序)

void SelectSort(int* a, int n)

{

    //优化:一趟选出最大和最小的

    int left = 0;

    int right = n - 1;




    while (left < right)

    {

        int mini = left, maxi = left;

        for (int i = left + 1; i <= right; i++)

        {

            if (a[i] < a[mini])

            {

                mini = i;

            }

            if (a[i] > a[maxi])

            {

                maxi = i;

            }

        }

        Swap(&a[left], &a[mini]);




        //如果left和maxi重叠,交换后需要修正一下再交换right和maxi

        if (left == maxi)

        {

            maxi = mini;

        }




        Swap(&a[right], &a[maxi]);




        left++;

        right--;

    }

}

注意:

        当我们在一趟比较结束后选出mini和maxi并做交换的时候,要小心如果left记录的位置恰好存放的是maxi,则第一步交left和mini后我就要重新maxi的位置做一个修正,如图:

​编辑

​编辑

​编辑


四.简单选择排序的时间度分析

我们可以发现,简单选择排序的特点是:

         元素挪次数很少,但是元素比次数很多,并且是数组天生的情况天生逆序的情况,元素比次数都是一,都是:T(n)=(n-1)+(n-2)+...+2+1=n(n-1) / 2 次.

          而对于次数而言,最好的,交次数0次,最坏的,交次数n-1次.

          基于的排序时间次数和比次数的,因此,时间依然是O(n^2).


结语

希望简单选择排序算法解能大家有所帮助,迎大佬留言或私信与我交流.

有关更多排序相关知可以移步:

【数据 构】八大排序算法 https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学,一起!

 相关文章推荐

【数据 构】八大排序之冒泡排序算法

【数据 构】八大排序之希 排序算法

【数据 构】八大排序之直接插入排序算法

【数据 构】八大排序之 简单选择 排序

【数据 构】八大排序之堆排序算法

【数据 构】八大排序之快速排序算法

【数据 构】八大排序算法之 并排序算法

【数据 构】八大排序之 数排序算法


数据构排序算法篇思维导图:

编辑

​编辑

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。