• 排序5:直接选择排序


    目录

    排序思想:

    演示图:

    代码实现

    总结:


    排序思想:

    · 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( ) 的数据元素
    · 若它不是这组元素中的最后一个 ( 第一个 )元素,则将它与这组元素中的最后一个(第一个)    元素交换
    · 在剩余的 array[i]--array[n-2] array[i+1]--array[n-1] )集合中,重复上述步骤,直到集合剩余 1 个元素

    演示图:

      

    代码实现

    单趟思路:

    设置四个 int 类型数据 minimaxibeginend 记录这一趟中所遇到的最小值与最大值以及开头和结尾的下标。遍历一遍找到所对应的值,交换 mini 和 begin  以及 maxi 和 end 对应的数据的值。

    分析:如果第一个是最大值是在begin的位置,在 mini 和 begin 交换时被换走之后但是maxi仍然指向怎么办?

    很简单,我们只需要做出以下操作,将maxi改正到指向正确的值上即可。

    1. if (maxi == begin)
    2. {
    3. maxi = mini;
    4. }

    代码:

    1. int begin = 0, end = n - 1;
    2. int mini = begin, maxi = begin;
    3. for (int i = begin + 1; i <= end; ++i)
    4. {
    5. if (a[i] > a[maxi])
    6. {
    7. maxi = i;
    8. }
    9. if (a[i] < a[mini])
    10. {
    11. mini = i;
    12. }
    13. }
    14. Swap(&a[mini], &a[begin]);
    15. //避免了如果第一个数最大,会被换走,但是maxi还指向第一个数
    16. if (maxi == begin)
    17. {
    18. maxi = mini;
    19. }
    20. Swap(&a[maxi], &a[end]);
    21. ++begin;
    22. --end;

    整轮实现:加上循环即可,我们只需要让 begin < end 的时候进行循环就可以走完整轮了。

    代码:

    1. void SelectSort(int* a, int n)
    2. {
    3. int begin = 0, end = n - 1;
    4. while (begin < end)
    5. {
    6. int mini = begin, maxi = begin;
    7. for (int i = begin + 1; i <= end; ++i)
    8. {
    9. if (a[i] > a[maxi])
    10. {
    11. maxi = i;
    12. }
    13. if (a[i] < a[mini])
    14. {
    15. mini = i;
    16. }
    17. }
    18. Swap(&a[mini], &a[begin]);
    19. //避免了如果第一个数最大,会被换走,但是maxi还指向第一个数
    20. if (maxi == begin)
    21. {
    22. maxi = mini;
    23. }
    24. Swap(&a[maxi], &a[end]);
    25. ++begin;
    26. --end;
    27. }
    28. }

      

    总结:

    1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。
        因为就算是大致有序了,仍然需要走完全过程,时间复杂度任何情况下都是O(N^2)。
    2. 时间复杂度: O(N^2)
    3. 空间复杂度: O(1)
    4. 稳定性:不稳定
  • 相关阅读:
    C++STL——vector类与模拟实现
    解决“您点击的链接已过期”;The Link You Followed Has Expired的问题
    Django配置连接池:使用django-db-connection-pool配置连接池
    浏览器无痕浏览还能查到记录吗,如何开启无痕模式
    如何借助问答平台上做好网络营销?
    【华为机试真题 JAVA】服务器广播-200
    在SpringBoot下,tomcat的运行模式:BIO、NIO、APR
    iptables防火墙
    Python Opencv实践 - Harris角点检测
    TensorFlow学习:在web前端如何使用Keras 模型
  • 原文地址:https://blog.csdn.net/qq_65139309/article/details/127617125