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

来源:互联网 发布:c语言define函数 编辑:程序博客网 时间:2024/06/04 17:57

选择排序算法详细分析

  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) 所以我们如果想改进选择排序的算法 ,我们必须改进最小元素的查询代码才是关键