前一篇文章我们讲了冒泡排序,这篇文章我们来讲一下选择排序。选择排序被称为逆向的冒泡排序,这是因为它俩的处理方式完全一样,只是选择排序每次获得最小值,冒泡排序每次选择最大值,仅此而已。
一、代码实现
function selectSort(arr = []){
let newData = [...arr];
let minIndex;
for (let x = 0; x < newData.length - 1; x++){
minIndex = x;
for (let y = minIndex + 1; y < newData.length - 1; y++){
if (newData[minIndex] > newData[y])(
minIndex = y;
}
}
[ newData[minIndex], newData[x] ] = [ newData[x], newData[minIndex] ];
}
return newData;
}
二、思路讲解
跟冒泡一样,都是双层循环,第一层循环用于锁定席位,第二层循环用于更新席位。
这里的席位就是指数组的索引。不知道大家有没有发现,其实我这种写法相当于从0到最后一项,每一项都更新了一遍。
逻辑推演如下:
1、假设有如下数据需要排序:
[10, 20, 30, 30, 50, 20, 70];
2、当 x = 0时,从我这种写法来看,那么我是一定要更新第0项的。
如何更新呢?我需要找到从第0项到最后一项的最小值。并将 这次的最小值 与 第0项 的值对调。
如何确定本次的最小值呢?
开始进行第2轮的循环。
第0项跟第1项比较,如果 第0项 < 第1项,说明前2项中,第0项是最小项。
第0项再跟第2项比较,如果 第0项 < 第2项,说明前3项中,第0项是最小项。
第0项再跟第3项比较,如果 第0项 < 第3项,说明前4项中,第0项是最小值。
直到将数组遍历结束,得出第0项对应的第1小值。
至此本轮推演结束。
此时的数据:[10, 20, 30, 30, 50, 20, 70];
3、当 x = 1时,从我这种写法来看,那么我是一定要更新第1项的。
如何更新呢?我需要找到从第1项到最后一项的最小值。并将 这次的最小值 与 第1项 的值对调。
如何确定本次的最小值呢?
开始进行第2轮的循环。
第1项跟第2项比较,如果 第1项 < 第2项,说明第2小值是 第1项。
第1项再跟第3项比较,如果 第1项 < 第3项,说明第2小值是 第1项。
循环往复。。。
直至得出第2小值。
至此本轮推演结束。
4、当 x = 2时,从我这种写法来看,那么我是一定要更新第2项的。
如何更新呢,我需要找到从第2项到最后一项的最小值。并将 这次的最小值 与 第2项 的值对调。
如何确定本次的最小值呢?
跟之前的逻辑一样,循环往复。。。
5、循环往复。。。
三、最后
好啦,本次的排序算法到这里就结束啦,下次更新“插入排序”,我们下次再见啦~~