zoukankan      html  css  js  c++  java
  • 直接选择排序

     

    【基本思想】

      每一次从待排序的序列中选出最小(或最大)的一个元素,存放在已排好序的序列的后一个位置,直到全部待排序的数据元素排完;

      例如,给定包含N个正整数元素的序列vector<int> seq
        第1趟:从seq[0]~seq[n-1]中选出最小的数据,将它与seq[0]交换;
        第2趟,从seq[1]~seq[n-1]中选出最小的数据,将它与seq[1]交换;
        第3趟,从seq[2]~seq[n-1]中选出最小的数据,将它与seq[2]交换;
        .... .... .... .... .... ....

        第n-1趟,从seq[n-2]~seq[n-1]中选出最小的数据,将它与seq[n-2]交换。

    【算法复杂度】

    时间复杂度(平均)时间复杂度 (最坏)时间复杂度(最好)空间复杂度稳定性
    O(n^2) O(n^2) O(n^2) O(1) 不稳定
     

    时间复杂度>>>

    选择排序的交换操作介于 0 和 (n - 1) 次之间,最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次;

    选择排序比较操作的次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。

    算法稳定性>>>

    选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只
    剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例
    子,序列5 8 5 2 9,我们知道第一遍选择第元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。 

    【动图演示】

      

    【算法实现】

    /*
    ** 直接选择排序算法的C++实现
    */
    
    void selectSort(vector<int>& seq){
        int length = seq.size();    // 待排序序列的长度
        for(int i=0;i<length-1;i++){
            int min=i,j=i+1;    // min设置为当前最小元素的下标
            for(;j<length;j++)    // 从未排好序的序列中选择最小的元素
                if(seq[j]<=seq[min]) min=j;    
    
            if(min!=i){      // 设置min!=i防止元素自身与自身交换
                seq[i] ^= seq[min];
                seq[min] ^= seq[i];
                seq[i] ^= seq[min];
            }
        }
    }
    本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 相关阅读:
    linux命令查询网站
    UTC(世界协调时间)时区和各个时区时间的转换
    dev-c++ 中写完源文件生成exe程序怎么避免运行闪退?
    numpy和time计时程序
    进化算法之粒子群算法和Matlab实现(多维)
    tf.config:GPU 的使用与分配(转载)
    限制TensorFlow只在CPU上运行的方法
    Python重要学习链接
    SpringCloud 之 Nacos 注册配置中心
    Jenkins 自动化部署入门详细教程
  • 原文地址:https://www.cnblogs.com/nkqlhqc/p/9183544.html
Copyright © 2011-2022 走看看