菜鸟教程选择排序算法c++版

选择排序算法详细分析

  1. 选择排序的定义:假如我们是把待排序的数组中的数据从小到大进行排序,下面我们先需要知道2个额外知识就是我们一个选择排序算法拿到一个数组和一个数组的元素个数之后,我们并不会额外开其他数组的情况下,我们需要把数组中的数据有序。我们就把当前待排序的数组中的数据分成待排序的一端和已经排序好的元素。 举例子来说比如一个数组 2 3 4 5 当我们从起点索引0开始排序这个时候我们的待排序数组那端就是2 3 4 5全部的数据 已经排序好的还没有,当进行一趟排序后 待排序范围就是3 4 5了,这个时候已经排序完毕的就是2代表的那个数组范围。
    下面正式进入选择排序的定义:我们每次从待排序数组中得到一个元素,比如我们这里第一次从待排序数组得到第一个元素2,然后把这个元素和他后面的元素一一比较,当我们发现后面元素比当前2小,我们就最小值的索引保存在一个临时变量中。我们默认开始第一个元素索引是最小值索引。
    当我们把后面的全部元素和2比较完毕后,我们必须判断总共临时变量的索引是不是变了,因为后面的如果都是大于2的话,我们的最小值索引肯定是不变的,如果发现变了说明后面有更小的数,我们就开始把2和那个最小的进行交换。总共时候我们已序数组范围就得到一个,待排序范围就减1.直到全部的外层循环完毕我们的数组就有序了。

    2.选择排序的不稳定性分析
    比如我们的待排序数组是5 8 5 2 9 当我们第一趟比较完毕后我们索引0对应的地方就放了2,索引4这个地方就放了5 这个时候你发现数组中的2个5 竟然交换了位置。话说排序的稳定性就是上面数组中第一个数5索引本来是0, 排序前一个5的索引是0 后一个5的索引是2 进行排序后 前面的5必须还是在索引2对应5的前面,但是我们的选择排序就把索引0那个5放到 2索引那个5的后面了。一句话算法稳定性就是待排序数组中有2个数值一样的数,排序之后 这2个相同数值的数据位置还是保持开始的先后顺序,不能换先后。

    3.选择排序算法时间复杂度分析就等代码完毕后在根据代码分析

下面正式上算法实现代码

//选择排序算法: array待排序的数组  n数组的元素个数
void SelectSort(int array[],int n)
{

     //遍历数组的n - 1个元素的索引进行排序   剩余1个就有序的
     for(int i = 0; i < n - 1; i++)   //外层循环会执行n - 1次
     {
          //定义临时索引 默认他是当前选择的元素最小值的索引
          int tempMinIndex = i;


          //开始得到外层循环对应的全部的后面的元素索引
          for(int j = i + 1; j < n; j++) //每次执行比较次数是j次
          {

               //可以准备比较当前i选择的元素和后面的全部元素
               if(array[j] > array[tempMinIndex])
               {
                    //说明我们在当前选择的元素后面找到了比当前选择元素更小的数据
                    //那我们就保存当小的元素对应的索引
                    tempMinIndex = j;
               }else
               {
                   //说明比对的2个元素已经是符号我们的顺序
                   //我们就和下个后面元素比较
                   continue;
               }

               //第一轮比较完毕后  也许找到了更小的数据
               if(tempMinIndex != i)  //交换元素最多是n -1个数都需要交换
               {
                    //说明找到了比当前选择的元素更小的数据  我们就开始交换他们
                    int temp = array[tempMinIndex];
                    array[tempMinIndex] = array[i];
                    array[i] = temp;
                    //上面代码执行次数最多是3(n - 1)次
               }else
               {
                   continue;
               }
          }


     }
}

int main()
{
    int arry[] = {50,400,300,20,10};

    SimpleSelectionSort(arry, 5);

    for (int i = 0; i < 5; i++)
    {
        std::cout << arry[i] << std::endl;
    }
    return 0;
}


选择算法的时间复杂度分析:
//执行次数= (n - 1) + …(n - 2) + ..+ 1 = (n - 1)n/2
//也就是比较的次数是n^2/2 - n/2 加上元素交换的次数 3(n- 1)
总体执行次数最多是n^2/2 + n - 3 那么时间复杂度T(n) = 0(n^2)
我们发现这个算法的瓶颈在于查找一个最小数值花费的时间复杂度是n^2, 而交换元素的时间复杂是0(n) 所以我们如果想改进选择排序的算法 ,我们必须改进最小元素的查询代码才是关键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛掰是怎么形成的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值