排序算法(2):选择排序

18 阅读2分钟

选择排序原理

上一节说过了冒泡排序,这一节说说选择排序。如果说冒泡排序是两两比较,找到最大的往后排。那么选择排序就是找最小的往左排序。

先把数组中的第一个当作最小值,与其它数值比对,如果它大于某个数,先记住那个小值的位置。然后再用这个小值与右边的其它数值比对,如果还有比它小的,就记住那个小的位置。如此在第一次遍历时就找到了最小值。然后就把最小值与左边第一个数交换位置。依次类推,找到第二小值放到左边第二个位置。

举例

给一个乱序的数组:[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²)