minIndex
目前的minIndex
let minIndex = (numbers) =>numbers.indexOf(min(mubers))let min = (numbers) => {if(numbers.length > 2){return min([numbers[0], min(numbers.slice(1))])}else{return Math.min.apply(null,numbers)}}
indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
重写minInd
循环写法
let minIdex = (numbers) => {let index = 0for(let i=1; i<numbers.length; i++){if(numbers[i] < numbers[index]){index = i}}return index}
排序 sort
目前的sort 递归写法
let sort = (numbers) => {if(nubers.length > 2){let index = minIdex(numbers)let min = numbers[index]numbers.splice(index,1)return [min].concat(sort(numbers))}else{return numbers[0]<numbers[1] ? numbers : numbers.reverse()}}
重写sort 循环写法
思路不变:每次找到最小的数放在前面,然后对后面的数做同样的事情,然后i++
let sort = (numbers) => {for(let i=0; i<???; i++){let index = minIndex(numbers)//找到当前范围最小的数,为index,按范围找最小//把最小的数放到当前循环的i处,按循序放最小swap(numbers,index,i)//交换}}let swap = (array,i,j) => {let temp = array[i]array[i] = array[j]array[j] = temp}//swap(numbers,1,2)
- 分析
怎么知道i<???处因该写什么
提前写好minIndex 能有效简化问题
用swap占位能有效简化问题
错误的实现 swap
let swap = (a,b) => {let temp = aa = bb = temp}swap(nubers[1],numbers[2])
你会发现,numbers[1] 和 numbers[2] 的值原封不动,因为 a b 是简单数据类型,传参的时候会复制值,而上面的 numbers 是对象,传参复制地址
传值 VS 传址
- 怎么知道 i<??? 处应该写什么
分析代码
let sort = (numbers) => {for(let i=0; i<???; i++){let index = minIndex(numbers)swap(number, index, i)}}

发现了问题
- minIndex 查找范围有问题
let index = minIndex(numbers)
这句有问题,如果上次循环找到了第一个最小的数字,那么之后找最小数字的时候,就可忽略第一个了
let index = minIndex(numbers.slice(i)) +i

- 为什么要 +i
因为前面的已经找到排好序了
如果不加,那么index总是从0数起
重新分析代码
let sort = (numbers) => {for(let i=0; i<???; i++){let index = minIndex(numbers.slice(i))+iswap(number, index, i)}}
最终带log代码
let sort = (numbers) => {for(let i=0; i< numbers.length -1; i++){console.log(`----`) // 这个log很精髓console.log(`i: ${i}`)let index = minIndex(numbers.slice(i))+ iconsole.log(`index: ${index}`)console.log(`min: ${numbers[index]}`)if(index!==i){swap(numbers, index, i)console.log(`swap ${index}: ${i}`)console.log(numbers)}}return numbers}//交换let swap = (array, i, j) => {let temp = array[i]array[i] = array[j]array[j] = temp}//找最小let minIndex = (numbers) => {let index = 0for(let i=1; i<numbers.length; i++){if(numbers[i] < numbers[index]){index = i}}return index}
最终纯净代码
let sort = (numbers) => {for(let i=0; i< numbers.length -1; i++){let index = minIndex(numbers.slice(i))+ iif(index!==i){swap(numbers, index, i)}}return numbers}let swap = (array, i, j) => {let temp = array[i]array[i] = array[j]array[j] = temp}let minIndex = (numbers) => {let index = 0for(let i=1; i<numbers.length; i++){if(numbers[i] < numbers[index]){index = i}}return index}
