算法问题:
    sort
    递归
    一分为二,分冶

    1. //冒泡排序
    2. bubbleSort = function(arr){
    3. const length = arr.length;
    4. let hasChanged = true;
    5. for(let i=0;i<length &&hasChanged;i++){
    6. for(let j= 0;j<length -1-i;j++){
    7. if(arr[j]>arr[j+1]){
    8. [arr[j],arr[j+1]] = [arr[j+1],arr[j]];
    9. hasChanged = true;
    10. }
    11. }
    12. }
    13. console.log(arr);
    14. };
    15. //插入排序
    16. insertSort = function(arr){
    17. let l = arr.length;
    18. let current;
    19. let preIndex
    20. for(let i=1;i<length;i++){
    21. //外层循环
    22. current = arr[i];
    23. preIndex = i-1;
    24. //内层循环,判断插入到哪里
    25. // 内循环结束,j+1 所指向的位置就是 current 值插入的位置
    26. while(preIndex>= 0 && arr[preIndex] > current){
    27. arr[preIndex+1] =arr[preIndex];
    28. preIndex --;
    29. }
    30. if(preIndex+1!==i){
    31. arr[preIndex+1] = current;
    32. }
    33. }
    34. console.log(arr);
    35. };
    36. selectionSort = function(arr){
    37. let minIndex = 0,temp;
    38. for(let i=0;i<arr.length;i++){
    39. minIndex = i;
    40. for(let j=i+1;j<arr.length;j++){
    41. if(arr[j] < arr[minIndex]){
    42. minIndex = j;
    43. }
    44. }
    45. temp = arr[i];
    46. arr[i] = arr[minIndex]
    47. arr[minIndex] = temp;
    48. }
    49. return arr;
    50. };
    51. //归并排序,先递归分为两部分,然后执行合并操作,递归时间复杂度是logn,合并操作是n,所以平均复杂度是nlogn
    52. merge = function(left,right){
    53. const result = [];
    54. while(left.length && right.length){
    55. if(left[0]<=right[0]){
    56. result.push(left.shift());
    57. } else{
    58. result.push(right.shift());
    59. }
    60. }
    61. while(left.length){
    62. result.push(left.shift());
    63. }
    64. while(right.length){
    65. result.push(right.shift());
    66. }
    67. return result;
    68. };
    69. mergeSort = function(arr){
    70. if(arr.length<2){
    71. return arr;
    72. }
    73. let mid = Math.floor(arr.length/2);
    74. let left = arr.slice(0,mid);
    75. let right = arr.slice(mid);
    76. return merge(mergeSort(left),mergeSort(right)) ;
    77. };
    78. //快排
    79. quickSort = function(arr){
    80. if (arr.length <= 1) {
    81. return arr;
    82. }
    83. let midIndex = Math.floor(arr.length/2);
    84. const mid = arr[midIndex];
    85. const left = [];
    86. const right = [];
    87. for(let i=0;i<arr.length;i++){
    88. if(arr[i]<mid){
    89. left.push(arr[i]);
    90. }else{
    91. right.push(arr[i]);
    92. }
    93. }
    94. return quickSort(left).concat(mid).quickSort(right)
    95. };