• 【学习挑战赛】经典算法之直接选择排序


    活动地址:CSDN21天学习挑战赛

    ✅作者简介:C/C++领域新星创作者,为C++和java奋斗中
    ✨个人社区:微凉秋意社区
    🔥系列专栏:经典算法
    📃推荐一款模拟面试、刷题神器👉注册免费刷题

    🔥前言

    书接上文,今天带来直接选择排序算法的解析过程,从概念到实现一步一个脚印的完成。天气那么热,快来点简单算法解解渴!

    直接选择排序算法解析

    一、理解直接选择排序思想

    整个过程就是每一趟都将无序区中的所有元素进行逐一比较,找到最小的元素,与无序区中的首个元素进行交换,每次遍历会让有序区长度加1,无序区长度减1。重复以上步骤,直到所有的元素均已排好。该排序也称简单选择排序。

    二、算法分析

    1、算法流程

    在这里插入图片描述

    • 流程图释义:
    • 黄色序列是最终效果,可以看出该序列是从小到大的顺序;
    • 蓝色是无序区,意思就是蓝色会一直往后遍历,选出最小值并把最小值放到蓝色区的开头,随后该块蓝色变为黄色,有序区加一,无序区减一。

    2、具体步骤

    1. 首先,将第一个元素固定,从剩下的元素中找到最小值下标并与固定位置的元素值互换
    2. 同上,只不过固定第二个元素,最后互换的也是第二个位置与最小值下标的值
    3. 直到该序列被遍历结束,排序才会结束
    • 值得注意的是,如果该序列长度为n,那么遍历n-1次即可,否则数组会溢出

    三、代码实现

    • 选择排序算法代码:
    //直接选择排序
    void dirChoose(int* arr, int len)
    {
    	for (int i = 0; i < len - 1; i++) {
    		int k = i;
    		for (int j = i + 1; j < len; j++) {
    			if (arr[j] < arr[k]) {
    				k = j;
    			}
    		}
    		if (k != i)//如果不等,说明存在无序区比固定位置的元素值小
    		{
    			int temp = arr[k];
    			arr[k] = arr[i];
    			arr[i] = temp;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 辅助函数速览:

    在这里插入图片描述

    • 主函数调用速览:

    在这里插入图片描述

    四、时间复杂度分析

    1、计算时间复杂度的一般步骤

    • 这里要说一下分析时间复杂度的方法:
    1. 找程序中的基本语句
      • 基本语句就是运行最多的那一行或者一段代码
    2. 分析基本语句的执行次数或者执行规律,写出时间复杂度
      • 符合近似计算原则,常见的有O(1)、O( n n n)、O( l o g 2 n log2n log2n) 和 O( n 2 n^{2} n2)

    2、该算法时间复杂度

    • 直接选择排序算法的外层循环和内层循环并没有执行次数上的联系,又因为外层会执行n-1次,而内层也会执行n-1次,所以该算法的时间复杂度就是O( n 2 n^{2} n2)

    写在最后
    这篇文章的最后我也是总结了一般计算时间复杂度的方法,大家可以根据本篇博文去分析时间复杂度或者再以后的做题中思考、锻炼。

  • 相关阅读:
    Design a TinyURL
    关于模型融合Stacking的一些改进思路
    @设计模式-单例模式
    大数据Hadoop之——Hadoop 3.3.4 HA(高可用)原理与实现(QJM)
    leetcode-54. 螺旋矩阵
    内网穿透工具之NATAPP(一)
    【IDEA】IDEA 单行注释开头添加空格
    C# 虚方法
    九、性能测试之网络测试
    校园论坛(Java)—— 帖子模块
  • 原文地址:https://blog.csdn.net/m0_58618795/article/details/126186869