选择排序原理
上一节说过了冒泡排序,这一节说说选择排序。如果说冒泡排序是两两比较,找到最大的往后排。那么选择排序就是找最小的往左排序。
先把数组中的第一个当作最小值,与其它数值比对,如果它大于某个数,先记住那个小值的位置。然后再用这个小值与右边的其它数值比对,如果还有比它小的,就记住那个小的位置。如此在第一次遍历时就找到了最小值。然后就把最小值与左边第一个数交换位置。依次类推,找到第二小值放到左边第二个位置。
举例
给一个乱序的数组:[9,6,10,5]
第一次:[9,6,10,5] 从第一个数开始最小值的下标 minIndex=0
下标minIndex=0开始:9>6? yes 记住6的下标,minIndex=1
下标minIndex=1代替第一个数往后对比:6>10? no ,minIndex=1
下标minIndex=1代替第一个数往后对比:6>5? yes ,minIndex=3。共比对3次 第一次遍历结束将第一个数与下标minIndex=3交换 [5,6,10,9]
第二次:[5,6,10,9] 从第二个数开始最小值的下标 minIndex=1
minIndex=1:6>10? no ,minIndex=1
minIndex=1:6>9? no ,minIndex=1 共比对2次 第二次遍历结束 minIndex=1 ,不交换
第三次:[5,6,10,9] 从第二个数开始最小值的下标 minIndex=2
minIndex=2:10>9 yes ,minIndex=3 共比对1次 第三次遍历结束 minIndex=3,交换 [5,6,9,10]
代码
function selectSort(array){
for (let i = 0; i < array.length; i++) {
let minIndex=i
for (let j = i+1; j < array.length; j++) {
if(array[minIndex]>array[j]){
minIndex=j
}
}
// 说明minIndex有变动过,将目前的最小值,下标minIndex的赋值给array[i]
if(i!==minIndex){
[array[i],array[minIndex]]=[array[minIndex],array[i]]
}
}
return array
}
let a=[9,6,10,5]
console.log(selectSort(a)); // [5, 6, 9, 10]
时间复杂度:选择排序的时间复杂度是:
最好情况:O(n²)
一般情况:O(n²)
最坏情况:O(n²)