最近的工作,有些乏味,每天埋没在需求或者bug中不能自拔,一旦出现空档期,就会产生无聊的罪恶感,心里总是想着还有那么多东西没有学会,怎么能去无所事事呢?
于是晚上加班回到家,打开电脑的chrome浏览器,书签依旧是那些工作中遇到的一些问题的排排列,许久没有更新书签,于是抱着无聊的心态点开了一10大排序算法,想看看自己的算法能力处于一个什么样的水平。
既然看到了这里,大家也猜到了结果,对,没错,很差,甚至连看了排序算法的说明,都依旧扭捏了好久,写了几行废代码,最后实在看不下去了,于是偷看了答案,没错,这就是前端同学们的通用做法,在了解思路后,就想开启一个序列记录一下自己的心得体会。
由于自己对冒泡排序比较熟悉,所以就直接跳过了,接下来是第一个选择排序算法,选择排序是一个比较类的排序,其实和冒泡排序很相似,不通点在于,冒泡排序是比较两个相邻元素的大小,然后再进行位置和值的交换,而选择排序则是对从数组中找到一个最小或者最大值(取决于升序还是降序),然后将其放在队列头部位置。
具体做法,双层for循环,外层循环负责按数组顺序遍历,内层循环负责查找最小或最大值,找到最小或最大值后,记录其索引(此时内层循环遍历结束),然后交换两个数的位置,然后外层循环去遍历数组中的剩余元素(遍历未排序的数组),内层循环继续找最小值(从已排序中查找),找到之后继续交换两个数的位置,当外层循环走完后,则每个数都得到了排序,
以升序排列的原理就是从未排序数组中找第一小、第二小、第三小,第n小的元素,放到已排序数组的后面,当所有的数遍历结束后,组成了一个由小到大的升序排列
。
const arr = [3, 2, 5, 9, 1, 4];
let minIndex = 0;
for (let i = 0; i < arr.length; i++) {
// 存储最小值索引
minIndex = i;
// 遍历剩余未排序的数组元素
for (let j = i + 1; j < arr.length; j++) {
// 如果当前值比最小值还小,则当前值索引为最小值索引
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 内层循环结束后,即可得到本轮中的最小值
// 再交换最小值和未排序元素的值, 为了永远将该轮的最小值放到数组的前面
[arr[minIndex], arr[i]] = [arr[i], arr[minIndex]];
}
console.log(arr); // [ 1, 2, 3, 4, 5, 9 ]