排序之选择排序 | 刷题打卡

182 阅读1分钟

psc.jpg

一、题目描述

对一个非有序数组进行升序的排序。

示例 1:

输入:[5, 8, 6, 3, 4, 7, 1, 2]
输出:[1, 2, 3, 4, 5, 6, 7, 8]

二、思路分析

选择排序会找到数组中的最小值,并选中它将其放在第一位。
接着会找到第二小的值,并选中它将其放在第二位。
以此类推,执行 n - 1 论(最后一位不用轮询)。

// 第一轮
 ^                 ^
[5, 8, 6, 3, 4, 7, 1, 2] 
 ^                 ^ 
[1, 8, 6, 3, 4, 7, 5, 2]

// 第二轮
    ^                 ^ 
[1, 8, 6, 3, 4, 7, 5, 2]
    ^                 ^ 
[1, 2, 6, 3, 4, 7, 5, 8]

// 第三轮
       ^  ^            
[1, 2, 6, 3, 4, 7, 5, 8]
       ^  ^            
[1, 2, 3, 6, 4, 7, 5, 8]

// 第四轮
          ^  ^            
[1, 2, 3, 6, 4, 7, 5, 8]
          ^  ^            
[1, 2, 3, 4, 6, 7, 5, 8]

// 第五轮
             ^     ^            
[1, 2, 3, 4, 6, 7, 5, 8]
             ^     ^            
[1, 2, 3, 4, 5, 7, 6, 8]

// 第六轮
                ^  ^            
[1, 2, 3, 4, 5, 7, 6, 8]
                ^  ^            
[1, 2, 3, 4, 5, 6, 7, 8]

// 第七轮
                   ^  ^            
[1, 2, 3, 4, 5, 6, 7, 8]
                   ^  ^            
[1, 2, 3, 4, 5, 6, 7, 8]

三、AC 代码

Array.prototype.selectionSort = function () {
    for (let i = 0, l = this.length - 1; i < l; i++) {
        let p = i
        for (let j = i; j < this.length; j++) {
            if(this[p] > this[j]) {
                p = j
            }
        }

        if(i !== p) {
            const temp = this[i]
            this[i] = this[p]
            this[p] = temp
        }
    }
}

const arr = [5, 8, 6, 3, 4, 7, 2, 1]
arr.selectionSort()
console.log(arr) // [ 1, 2, 3, 4, 5, 6, 7, 8 ]

四、总结

选择排序实际上就是不断的寻找数组中最大或者最小的数并和当前循环开始位置的数进行交换。

需要注意的是循环的区间是 arr.length - 1 以及 内循环 arr.length & 循环起始值为外循环的循环次数(j = i) 可以减少不必要的循环。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情