【软考】算法-选择

选择排序的本质是先假设第一个数是最大/小的记录下第一个数的位置,让第一个数去跟后面的数比较,如果有比他更大/小的,就用这个更大/小的数去继续比较,依照这个规则在这一趟中找到最大/小的,和第一个数交换位置。 后面的数也是这样交换。

 

选择是固定位置找元素,而插入是固定元素找位置


以下我都以找最小数为例:

 

选择排序乍一看来有一点像抓起一个最小的数直接扔到第一个位置上了,其实他的关键在于记录了数的位置

 


第一趟,先记录下12的位置,12和后面的数比较,比到9发现,9<12,记录下9的位置,用9继续和后面的数比较,比到6发现,6<9,记录下6的位置,用6和后面的数比较,6比后面的数都小,就612的位置交换(即最小的数和第一个数交换)

 

第二趟同理,记录15的位置,然后用15去和后面的数比较,直到找到最小的9,将915的位置交换

 

第三趟同理,1512的位置交换

 




红线部分是每一趟比较之后找出的数,我们可以看到,选择排序的左下角都是有序区,还记得插入排序哪里是有序区吗?

 

选择排序核心代码:

 

 int temp = 0;
            for (int i = 0; i < arr.Length - 1; i++)
            {
                int minVal = arr[i]; //假设 i 下标就是最小的数
                int minIndex = i;  //记录我认为最小的数的下标

                for (int j = i + 1; j < arr.Length; j++)   //这里只是找出这一趟最小的数值并记录下它的下标
                {
                    //说明我们认为的最小值,不是最小
                    if (minVal > arr[j])    //这里大于号是升序(大于是找出最小值) 小于是降序(小于是找出最大值)
                    {
                        minVal = arr[j];  //更新这趟最小(或最大)的值 (上面要拿这个数来跟后面的数继续做比较)
                        minIndex = j;    //记下它的下标
                    }
                }
                //最后把最小的数与第一的位置交换
                temp = arr[i];    //把第一个原先认为是最小值的数,临时保存起来
                arr[i] = arr[minIndex];   //把最终我们找到的最小值赋给这一趟的比较的第一个位置
                arr[minIndex] = temp;  //把原先保存好临时数值放回这个数组的空地方,  保证数组的完整性
           
            }



 

我又要说这句话了,其根本还是两个数交换位置

 

选择排序时间复杂度:

空间复杂度:

最优情况(已经有序,本就不要交换位置,就不需要借助第三变量temp: O(0)

 

最差情况(逆序,全部都要交换位置):On




  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
Dijkstra算法是一种解决单源最短路径问题的算法,该问题是指在一个加权有向图中,从源节点出发到达所有其他节点的最短路径。其基本思想是通过不断地选择当前最短路径的节点来推进搜索,直到找到目标节点或者搜索完所有的节点。Dijkstra算法通过维护一个距离列表和一个已访问节点列表来实现,通过不断更新距离列表来找到最近的节点。 与Dijkstra算法相比,还有一些其他的最短路径算法,其中比较常见的包括贝尔曼-福特算法、Floyd-Warshall算法和A*算法。 贝尔曼-福特算法是一种解决单源最短路径问题的动态规划算法,它通过不断地更新距离列表来找到最短路径。与Dijkstra算法不同的是,贝尔曼-福特算法可以处理有负权边的图,但其时间复杂度较高。 Floyd-Warshall算法是一种解决全源最短路径问题的算法,它可以找到任意两个节点之间的最短路径长度。Floyd-Warshall算法通过一个二维数组来记录任意两个节点之间的最短路径长度,并通过动态规划的方式不断更新这个数组。 A*算法是一种启发式搜索算法,它可以用于解决最短路径问题。与Dijkstra算法和贝尔曼-福特算法不同的是,A*算法通过一个估价函数来指导搜索过程,以期望能够更快地找到最短路径。它的基本思想是通过综合考虑节点到目标节点的实际代价和启发式函数的估价来选择下一个节点。 综上所述,Dijkstra算法是一种常见的解决单源最短路径问题的算法,而贝尔曼-福特算法、Floyd-Warshall算法和A*算法则是其他解决最短路径问题的算法,它们各自有不同的适用场景和特点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值