排序思想:
- 先假定数组中的第 0 个就是最小的数字的索引
- 然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
- 知道数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置
- 再来第二趟遍历,假定第 1 个是最小的数字的索引
- 在遍历一次数组,找到比我小的那个数字的索引
- 遍历结束后换个位置
- 依次类推,也可以把数组排序好
1、准备一个数组
var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]
2、假定数组中的第 0 个是最小数字的索引
var minIndex = 0
3、遍历数组,判断,只要数字比我小,那么就替换掉原先记录的索引
var minIndex = 0
for (var i = 0; i < arr.length; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
// 遍历结束后找到最小的索引
// 让第 minIndex 个和第 0 个交换
var temp = arr[minIndex]
arr[minIndex] = arr[0]
arr[0] = temp
4、按照数组的长度重复执行上面的代码
for (var j = 0; j < arr.length; j++) {
// 因为第一遍的时候假定第 0 个,第二遍的时候假定第 1 个
// 所以我们要假定第 j 个就行
var minIndex = j
// 因为之前已经把最小的放在最前面了,后面的循环就不需要判断前面的了
// 直接从 j + 1 开始
for (var i = j + 1; i < arr.length; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
// 遍历结束后找到最小的索引
// 第一趟的时候是和第 0 个交换,第二趟的时候是和第 1 个交换
// 我们直接和第 j 个交换就行
var temp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = temp
}
5、和之前一样,倒数第二次排序完毕之后,就已经排好了,最后一次也没有必要了
for (var j = 0; j < arr.length - 1; j++) {
var minIndex = j
for (var i = j + 1; i < arr.length; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
var temp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = temp
}
- 在交换变量之前,可以判断一下,如果我们遍历后得到的索引和当前的索引一样
- 那么就证明当前这个就是目前最小的,那么就没有必要交换
- 最后我们要判断,最小索引和当前索引不一样的时候,才交换
for (var j = 0; j < arr.length - 1; j++) {
var minIndex = j
for (var i = j + 1; i < arr.length; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
if (minIndex !== j) {
var temp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = temp
}
}
6、至此,选择排序完成。