选择排序的个人理解:
-
先假定数组中的第 0 个就是最小的数字的索引
-
然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
-
直到数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置
-
再来第二趟遍历,假定第 1 个是最小的数字的索引
-
在遍历一次数组,找到比我小的那个数字的索引
-
遍历结束后换个位置
-
依次类推,也可以把数组排序好
1.准备一个数组
let data = //定义一个数组 [ { name: "张三", score: 98 }, { name: "李四", score: 78 }, { name: "王五", score: 34 }, { name: "静香", score: 81 }, { name: "胖虎", score: 18 }, { name: "大雄", score: 8 }, { name: "小夫", score: 88 }, { name: "柯南", score: 100 }, { name: "小福贵", score: 68 } ]
2.假定数组中的第0个是最小数字的索引
let min = 0;
3.遍历数组,判断,只要数字比我小,那么就替换掉原先记录的索引
let min = 0 for (let i = 0; i < data.length; i++) { if (data[i] < data[min]) { min = i } } // 遍历结束后找到最小的索引 // 让第 minIndex 个和第 0 个交换 let temp = data[min] data[min] = data[0] data[0] = temp
4.按照数组的长度重复执行上面的代码
for (let j = 0; j < data.length; j++) { // 因为第一遍的时候假定第 0 个,第二遍的时候假定第 1 个 // 所以我们要假定第 j 个就行 data min = j // 因为之前已经把最小的放在最前面了,后面的循环就不需要判断前面的了 // 直接从 j + 1 开始 for (let i = j + 1; i < data.length; i++) { if (data[i] < data[min]) { min = i } } // 遍历结束后找到最小的索引 // 第一堂的时候是和第 0 个交换,第二趟的时候是和第 1 个交换 // 我们直接和第 j 个交换就行 let temp = data[min] data[min] = data[j] data[j] = temp }
5.一些优化
和之前一样,倒数第二次排序完毕以后,就已经排好了,最后一次没有必要了
for (let j = 0; j < data.length - 1; j++) { let min = j for (let i = j + 1; i < data.length; i++) { if (data[i] < data[min]) { min = i } } let temp = data[min] data[min] = data[j] data[j] = temp }
在交换变量之前,可以判断一下,如果我们遍历后得到的索引和当前的索引一致
那么就证明当前这个就是目前最小的,那么就没有必要交换
做一我们要判断,最小作引和当前作引不一样的时候,才交换
最后整体JS代码如下:
<!-- 选择排序 -->
<script>
let data = //定义一个数组
[
{ name: "张三", score: 98 },
{ name: "李四", score: 78 },
{ name: "王五", score: 34 },
{ name: "静香", score: 81 },
{ name: "胖虎", score: 18 },
{ name: "大雄", score: 8 },
{ name: "小夫", score: 88 },
{ name: "柯南", score: 100 },
{ name: "小福贵", score: 68 }
]
for (let j = 0; j < data.length-1; j++) { //第二层循环
let min = j;
for (let i = j + 1; i < data.length; i++) {
if (data[i].score < data[min].score) {
min = i;
}
}
[data[j],data[min]]=[data[min],data[j]] //用数组的元素置换简化额外付临时值的操作
}
console.log(data);
</script>