选择排序
从头到尾扫描序列,找出最小的一个元素,和第一个元素交换,
接着从剩下的元素中继续这种选择和交换,
最终得到一个有序数列
代码
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
]
*/