所有的递归都能变成循环

    1. //基础排序
    2. let sort = (numbers) => {
    3. for(let i=0; i< numbers.length -1; i++){
    4. console.log(`----`) //这个log很精髓
    5. console.log(`i: ${i}`)
    6. let index = minIndex(numbers.slice(i))+ i
    7. console.log(`index: ${index}`)
    8. console.log(`min: ${numbers[index]}`)
    9. if(index!==i){
    10. swap(numbers, index, i)
    11. console.log(`swap ${index}: ${i}`)
    12. console.log(numbers)
    13. }
    14. }
    15. return numbers
    16. }
    17. let swap = (array, i, j) => {
    18. let temp = array[i]
    19. array[i] = array[j]
    20. array[j] = temp
    21. }
    22. let minIndex = (numbers) => {
    23. let index = 0
    24. for(let i=1; i<numbers.length; i++){
    25. if(numbers[i] < numbers[index]){
    26. index = i
    27. }
    28. }
    29. return index
    30. }
    31. // 快速排序
    32. let quickSort = arr => {
    33.   if (arr.length <= 1) { return arr; }
    34.   let pivotIndex = Math.floor(arr.length / 2);
    35.   let pivot = arr.splice(pivotIndex, 1)[0];
    36.   let left = [];
    37.   let right = [];
    38.   for (let i = 0; i < arr.length; i++){
    39.     if (arr[i] < pivot) { left.push(arr[i])
    40.     } else { right.push(arr[i]) }
    41.   }
    42.   return quickSort(left).concat(
    43. [pivot], quickSort(right) )
    44. }
    45. // 归并排序
    46. let mergeSort = arr =>{
    47. let k = arr.length
    48. if(k===1){return arr}
    49. let left = arr.slice(0, Math.floor(k/2))
    50. let right = arr.slice(Math.floor(k/2))
    51. return merge(mergeSort(left), mergeSort(right))
    52. }
    53. let merge = (a, b) => {
    54. if(a.length === 0) return b
    55. if(b.length === 0) return a
    56. return a[0] > b[0] ?
    57. [b[0]].concat(merge(a, b.slice(1))) :
    58. [a[0]].concat(merge(a.slice(1), b))
    59. }
    60. // 计数排序
    61. let countSort = arr =>{
    62. let hashTable = {}, max = 0, result = []
    63. for(let i=0; i<arr.length; i++){ // 遍历数组
    64. if(!(arr[i] in hashTable)){
    65. hashTable[arr[i]] = 1
    66. }else{
    67. hashTable[arr[i]] += 1
    68. }
    69. if(arr[i] > max) {max = arr[i]}
    70. }
    71. for(let j=0; j<=max; j++){ // 遍历哈希表
    72. if(j in hashTable){
    73. for(let i = 0; i<hashTable[j]; i++){
    74. result.push(j)
    75. }
    76. }
    77. }
    78. return result
    79. }