排序算法--直接选择排序

2024-05-13 1167阅读

前提:

        选择排序:选择排序(Selection sort)是一种比较简单的排序算法。它的算法思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

  话不多说,直接放图:

排序算法--直接选择排序

这里每次找到最小的那个元素,将其与未排序序列的第一个元素交换,交换后最小的那个元素已经找到,再从未排序序列中找第二小的元素......直到序列完全有序。

直接选择排序: 

          直接选择排序,顾名思义,直接选择最小或最大的数。它的思想完全契合选择排序的思想,这里就不再过多赘述。

 直接排序的过程:排序算法--直接选择排序

手敲的代码: 

排序算法--直接选择排序​ 

这里我们的思路就是定义一个变量begin,作为未排序序列的第一个数,定义一个变量mini保存最小数的下标。然后从第begin+1个数开始遍历整个序列,如果找到比a[mini]还小的数,就将mini更新为该数的下标。遍历完后就将mini位置的数交换到begin处。最小数确定后,begin++;再遍历剩下的序列,找第二小的数.......直到完全有序。

排序算法--直接选择排序

排序算法--直接选择排序排序算法--直接选择排序

有没有觉得这样每循环一次仅选一个数出来有点浪费?不如我们直接一次选两个数怎么样?

微调版直接选择排序代码分析:

  根据我们上面的分析,改动版的的代码就是一次完成最大、最小两个数的排序,实际上与一个数的排序并没有什么不同。 

 依旧是手敲代码:

 排序算法--直接选择排序

排序算法--直接选择排序

排序算法--直接选择排序

这里无非是多定义了两变量,end与maxi。end控制尾部的变化。一次交换完成后,序列找到最大值和最小值,begin++,end--;继续找未排序序列里的最大值和最小值。排序算法--直接选择排序

排序算法--直接选择排序

运行代码也是没什么问题。但是,我们一直用一组数据测也没啥意思,换下面这组组数据玩玩:

排序算法--直接选择排序

排序算法--直接选择排序

有没有发现不一样了?我们的排序是完全不正确。

遇事不决,调试代码:

排序算法--直接选择排序

1、                                                                  2、

排序算法--直接选择排序排序算法--直接选择排序

3、                                                                4、

排序算法--直接选择排序排序算法--直接选择排序

有没有看出问题?

     我们的最大的数是13,第一次交换时最小值a[6]=0与a[0]=13交换后,最大值的下标maxi还是0。导致后面最大值和end交换的就不是最大值!更要命的,一次交换完,begin和end收缩,a[0]与a[10]的位置已经固定,无法再改动,导致程序越运行越错。

     找到了问题,方法就会有:因为第一次与a[0]交换的一定是最小值(这里的特殊错误是因为begin里放的是整个序列的最大值导致的),所以我们可以加个判断:

排序算法--直接选择排序

当最大值碰巧在begin位置上,交换了最小值后就将maxi更新到mini的位置(如上图就是maxi从下标为0更新到下标为6的位置)。以此来防止最大值的丢失。

排序算法--直接选择排序

直接选择排序的时间复杂度:

 时间复杂度为铁铁的O(n^2),最好是直接有序为O(n);

直接选择排序的是不稳定的排序:

排序算法--直接选择排序

排序算法--直接选择排序

注意到上面演示排序过程中两个6的变化了吗?

很明显两个6的位置发生了变化,因此是不稳定的排序。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]