
选择排序,可以说是最简单直观的排序方法了。
一般来说选择排序是将最小数字与第一(n)位进行交换,并重复这一过程;但是对于刚学习编程的人来说,如何写出交换的过程,稍微有一些复杂。
下面先介绍一下更符合人类思考方式的方法,简单的过程如下:
1.先把一组数字浏览一遍,我们找出其中最小的数字
2. 在旧数组里拿出来
3. 再放到一个新地方(数组)
这样重复操作到每个数字,将所有数字都放到新数组,就从小到大排序完成了。
这里还是用13个数字假装成扑克牌进行演示
[3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
其实不用多说一眼就可以看明白,只要重复排序过程(要排序的数字次),就排序完成啦。
下面写一下关键代码:
// 1.找出其中最小的数字min, 顺便找到它的位置minIndex
let min = arr[0]
let minIndex
for (let i=1; i<arr.length; i++) {
if (arr[i] < min) {
min = arr[i]
minIndex = i
}
}
// 2.在旧数组里拿出来
arr.splice(minIndex, 1)
// 在JavaScript中很简单只要用splice就可以了, 其他语言可能这一步要麻烦一点
// 3. 再将这个数字放到一个新数组
let sorted = []
sorted.push(min)
把这些步骤组合起来,重复执行13次(每个数字执行一次)即可完成排序:
let arr = [3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
let sorted = [] // 定义一个新地方放排序过的数字
let length = arr.length // 次数:每个数字都要排一次
for (let j=0; j<length; j++) {
let min = arr[0] // 这里是步骤1
let minIndex
for (let i=1; i<length; i++) {
if (arr[i] < min) {
min = arr[i]
minIndex = i
}
}
arr.splice(minIndex, 1) // 步骤2
sorted.push(min) // 步骤3
console.log(arr) // 这里输出每一步可以清楚看到过程
console.log(sorted)
}
顺便把比较常见的选择排序写下来:
let arr = [3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
let length = arr.length
for (let j=0; j<length; j++) { // 外侧循环j确定要交换的数字位置
let min = arr[j]
let minIndex = j // minIndex需要设定默认最小值位置
for (let i=j; i<length; i++) { // 内层循环找出j之后最小数字的位置
if (arr[i] < min) {
min = arr[i]
minIndex = i
}
}
[arr[j], arr[minIndex]] = [arr[minIndex], arr[j]] // 这里进行数字交换,也可以使用其他方法
console.log(arr)
}
当然选择排序也有很多优化的方法,比如再循环中‘我拿大,你拿小’就可以减少一半过程,但是由于这个排序很少用到,只要领会思想就够了,以后有机会再写。