1. // 通用函数
    2. function swap(array, left, right) {
    3. let rightValue = array[right]
    4. array[right] = array[left]
    5. array[left] = rightValue
    6. }
    7. /* 1冒泡排序
    8. * 原理:
    9. * 从第一个元素开始,把当前元素current与下一个索引对应的元素next进行比较,如果current > next(升序),
    10. * 则交换位置,重复此操作直到最后一个元素,此时最后一个元素就是这个数组中最大的元素,下一轮比较中已经确定顺序的
    11. * 元素就不需要参与了
    12. * 时间复杂度:平方阶O(n^2)
    13. */
    14. function bubbleSort(array) {
    15. for (let i = array.length - 1; i > 0; i--) {
    16. for (let j = 0; j < i; j++) {
    17. if (array[j] > array[j + 1]) {
    18. swap(array, j, j + 1)
    19. }
    20. }
    21. }
    22. }
    23. /* 2插入排序
    24. * 原理:
    25. * 默认第一个元素已经排好序了,取下一个元素和当前元素作比较,如果当前元素大(升序)就交换位置,
    26. * 此时前两个元素已经排好序了,再取下一个元素和前面已经排好序的元素在进行比较(从后往前比较,
    27. * 因为下一个元素是和前面已经排好序的的最后一个元素是连着的)
    28. * 时间复杂度:平方阶O(n^2)
    29. */
    30. function insertSort(array) {
    31. for (let i = 1; i < array.length; i++) {
    32. for (let j = i - 1; j >= 0; j--) {
    33. if (array[j] > array[j + 1]) {
    34. swap(array, j, j + 1)
    35. }
    36. }
    37. }
    38. }
    39. /* 3选择排序
    40. (选择最小的)
    41. * 原理:
    42. * 从索引值0开始,与后面元素依次进行比较,如果索引值0的元素比某个元素大,则交换位置(升序),
    43. * 第一轮比较完之后,索引值0位置的元素就是最小的,下一轮取索引值是1的元素重复操作,寻找下一
    44. * 个相对比较小的值
    45. *
    46. * 时间复杂度:平方阶O(n^2)
    47. */
    48. function selectionSort(array) {
    49. for (let i = 0; i < array.length - 1; i++) {
    50. for (let j = i + 1; j < array.length; j++) {
    51. if (array[i] > array[j]) {
    52. swap(array, i, j)
    53. }
    54. }
    55. }
    56. }
    57. /**
    58. * 4快速排序
    59. * 原理:
    60. * (1)在数据集之中,选择一个元素作为"基准"(pivot)。
    61. * (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
    62. * (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
    63. *
    64. * 时间复杂度:平均时间复杂度O(nlogn) 最差复杂度O( n^2 )
    65. */
    66. function quickSort(array) {
    67. // 递归只剩一个元素的时候直接返回
    68. if (array.length <= 1) {
    69. return array;
    70. }
    71. const pivotIndex = Math.floor(array.length / 2)
    72. const pivot = array.splice(pivotIndex, 1)[0];
    73. const left = [];
    74. const right = [];
    75. for (let i = 0; i < array.length; i++) {
    76.     if (array[i] < pivot) {
    77.       left.push(array[i]);
    78.     } else {
    79.       right.push(array[i]);
    80.     }
    81.   }
    82. return [...quickSort(left), pivot, ...quickSort(right)]
    83. }