所有的递归都能变成循环
//基础排序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 quickSort = arr => {if (arr.length <= 1) { return arr; }let pivotIndex = Math.floor(arr.length / 2);let pivot = arr.splice(pivotIndex, 1)[0];let left = [];let right = [];for (let i = 0; i < arr.length; i++){if (arr[i] < pivot) { left.push(arr[i])} else { right.push(arr[i]) }}return quickSort(left).concat([pivot], quickSort(right) )}// 归并排序let mergeSort = arr =>{let k = arr.lengthif(k===1){return arr}let left = arr.slice(0, Math.floor(k/2))let right = arr.slice(Math.floor(k/2))return merge(mergeSort(left), mergeSort(right))}let merge = (a, b) => {if(a.length === 0) return bif(b.length === 0) return areturn a[0] > b[0] ?[b[0]].concat(merge(a, b.slice(1))) :[a[0]].concat(merge(a.slice(1), b))}// 计数排序let countSort = arr =>{let hashTable = {}, max = 0, result = []for(let i=0; i<arr.length; i++){ // 遍历数组if(!(arr[i] in hashTable)){hashTable[arr[i]] = 1}else{hashTable[arr[i]] += 1}if(arr[i] > max) {max = arr[i]}}for(let j=0; j<=max; j++){ // 遍历哈希表if(j in hashTable){for(let i = 0; i<hashTable[j]; i++){result.push(j)}}}return result}
