🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[warning]选择排序 ---- > 跑一次, 找最小, 然后交换, 多执行几次 ---- ##### 看图说话 ----- ![](https://box.kancloud.cn/f37e5468225dff6e2edd0d9bec3778a2_954x537.gif) ---- 1. 先学会交换2个变量的值 ~~~ let a = 10, b = 20; let c = a; a = b; b = c; console.log(a, b); ~~~ 2. 找到, 数组中最小元素的下标 ~~~ let arr = [2, 5, 8, 1, 3, 4, 10, 9]; let minIndex = 0; for (let j = 0; j < arr.length; j++){ if (arr[j] < arr[minIndex]){ minIndex = j; } } console.log(minIndex); ~~~ 3. 把最小值, 和目标交换 ~~~ let arr = [2, 5, 8, 1, 3, 4, 10, 9]; let minIndex = 0; for (let j = 0; j < arr.length; j++){ if (arr[j] < arr[minIndex]){ minIndex = j; } } let c = arr[0]; arr[0] = arr[minIndex]; arr[minIndex] = c; console.log(arr); ~~~ 4. 这样第一位放了最小值, 那让上面代码, 多执行几次是不是就好了呢 ~~~ let arr = [2, 5, 8, 1, 3, 4, 10, 9]; for (let i = 0; i < arr.length; i++) { // 注意这里不能再用0了, 因为第二次执行, 0位置已经是最小值了, 所以这里直接用i, 让索引继续向后 let minIndex = i; // 这里也注意不要用0, 因为0位置放了最小值, 而且也不要用i, 自己和自己比没有意义 for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } let c = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = c; } console.log(arr); ~~~ ----------- ## 扩展1: ~~~ 当外层循环到最后一次, 没有必要再比较了, 所以最外层可以-1 ~~~ 优化后代码: ~~~ let arr = [2, 5, 8, 1, 3, 4, 10, 9]; for (let i = 0; i < arr.length - 1; i++) { let minIndex = i; for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } let c = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = c; } console.log(arr); ~~~ ## 扩展2: ~~~ 内层for循环后, 发现i就是最小值的下标, 不需要交换, 所以给判断加个判断条件 ~~~ 优化后代码: ~~~ let arr = [2, 5, 8, 1, 3, 4, 10, 9]; for (let i = 0; i < arr.length - 1; i++) { let minIndex = i; for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } if (minIndex !== i){ let c = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = c; } } console.log(arr); ~~~