【软考】算法-选择

xiaoxiao2021-02-27  318

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

 

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

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

 

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

 

第一趟,先记录下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

转载请注明原文地址: https://www.6miu.com/read-1666.html

最新回复(0)