冒泡排序

千条数据排序所用时间对比:
截屏2021-07-09 下午2.16.43.png
万条数据排序所用时间对比:
截屏2021-07-09 下午2.14.54.png

  1. function randArray(len, min, max) {
  2. return Array.from({ length: len }, v => Math.floor(Math.random() * (max - min)) + min);
  3. }
  4. bubbleSort(randArray(10000, 1, 100000));
  5. bubbleSort1(randArray(10000, 1, 100000));
  6. // 普通版
  7. function bubbleSort(arr) {
  8. var len = arr.length;
  9. console.time('冒泡排序');
  10. for (var i = 0; i < len; i++) {
  11. for (var j = 0; j < len - 1 - i; j++) {
  12. if (arr[j] > arr[j + 1]) {
  13. var temp = arr[j + 1];
  14. arr[j + 1] = arr[j];
  15. arr[j] = temp;
  16. }
  17. }
  18. }
  19. console.timeEnd('冒泡排序');
  20. console.dir(arr);
  21. return arr;
  22. }
  23. // 优化版
  24. function bubbleSort1(arr) {
  25. let low = 0;
  26. let hign = arr.length - 1;
  27. let j, tmp;
  28. console.time('冒泡排序1');
  29. while (low < hign) {
  30. for (j = low; j < hign; ++j) {
  31. if (arr[j] > arr[j + 1]) {
  32. tmp = arr[j];
  33. arr[j] = arr[j + 1];
  34. arr[j + 1] = tmp;
  35. }
  36. }
  37. --hign;
  38. for (j = hign; j > low; --j) {
  39. if (arr[j] < arr[j - 1]) {
  40. tmp = arr[j];
  41. arr[j] = arr[j - 1];
  42. arr[j - 1] = tmp;
  43. }
  44. }
  45. ++low;
  46. }
  47. console.timeEnd('冒泡排序1');
  48. console.dir(arr);
  49. return arr;
  50. }

合并排序

  1. 把⻓度为n的输⼊序列分成两个⻓度为n/2的⼦序列
    2. 对两个⼦序列分别采⽤归并排序
    3. 将两个排序好的⼦序列合并成⼀个最终的排序序列。 ```javascript function mergeSort(arr) { const len = arr.length;

    if (len < 2) { return arr; }

    const middle = Math.floor(len / 2); const left = arr.slice(0, middle); const right = arr.slice(middle);

    return merge(mergeSort(left), mergeSort(right)); }

function merge(left, right) { let result = [];

while (left.length && right.length) { if (left[0] <= right[0]) { result.push(left.shift()) } else { result.push(right.shift()) } }

while (left.length) { result.push(left.shift()) } while (right.length) { result.push(right.shift()) }

return result; }

const list = [2, 34, 25, 33, 13, 6]; mergeSort(list);

  1. <a name="Zf8o9"></a>
  2. # 快速排序
  3. > 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
  4. ```javascript
  5. function quickSort(array) {
  6. // 替换数据
  7. function swap(array, a, b) {
  8. [array[a], array[b]] = [array[b], array[a]]
  9. }
  10. // 分治函数
  11. function partition(array, left, right) {
  12. // ⽤index取中 值⽽⾮splice
  13. const pivot = array[Math.floor((right + left) / 2)]
  14. let i = left
  15. let j = right
  16. while (i <= j) {
  17. while (array[i] < pivot) {
  18. i++
  19. }
  20. while (array[j] > pivot) {
  21. j--
  22. }
  23. if (i <= j) {
  24. swap(array, i, j)
  25. i++
  26. j--
  27. }
  28. }
  29. return i
  30. }
  31. // 快排函数
  32. function quick(array, left, right) {
  33. let index
  34. if (array.length > 1) {
  35. index = partition(array, left, right)
  36. if (left < index - 1) {
  37. quick(array, left, index - 1)
  38. }
  39. if (index < right) {
  40. quick(array, index, right)
  41. }
  42. }
  43. return array
  44. }
  45. return quick(array, 0, array.length - 1)
  46. }
  47. quickSort([22, 3453, 4667, 25, 65, 87, 6897, 46, 567]);