Skip to content

选择排序

从头到尾扫描序列,找出最小的一个元素,和第一个元素交换,

接着从剩下的元素中继续这种选择和交换,

最终得到一个有序数列

选择排序

代码

js
// 选择排序
function selectSort(arr) {
    // 外层循环控制选择的趟数 n-1 趟
    for (let i = 0; i < arr.length - 1; i++) {

        // 内层循环进行比较,记录本趟的最小值,放到未排好序数组的首位
        let minIndex = i // 记录本趟最小值的索引,默认为第一个值
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[minIndex] > arr[j]) { // 寻找最小值
                minIndex = j // 保存最小值的索引
            }
        }

        // 交换,把本趟最小值放到首位
        if (minIndex !== i) { // 假如第一位已经是最小的了,就不用交换,只有发现最小的在其他位置时才交换
            let temp = arr[minIndex]
            arr[minIndex] = arr[i]
            arr[i] = temp
        }
    }
}

/* 
根冒泡有点类似,
换了种方式,
每次找到最小的,把最小的值放到开头,
然后从剩下的找

如果 有 n 个数
外层循环控制选择的趟数,每一趟都会排好序一个值,所以需要走 n-1趟(外层循环)
内层循环记录每一趟的最小值,把最小值放到为排好序数组的首位,比较次数也随着层级减少(内层循环)

假如有 5 个数
需要走 4 趟,(最后剩一位不用比较,肯定是排好序的)

第一趟 需要比较 4 次 -> 排好序1位,剩4个数
第二趟 需要笔记 3 次 -> 排好序2位,剩3个数
第三趟 需要比较 2 次 -> 排好序3位,剩2个数
第四趟 需要比较 1 次 -> 排好序4位,剩1个数
最后一个数不用比较,结束

*/

let arr = [10, 7, 9, 11, 22, 33, 4, 2]

selectSort(arr)

console.log(arr); // 
/* 
[
   2,  4,  7,  9,
  10, 11, 22, 33 
]
*/

参考

https://www.bilibili.com/video/BV1Ur4y1w7tv?p=4