美文网首页
TS数据结构与算法之快速排序

TS数据结构与算法之快速排序

作者: 子十一刻 | 来源:发表于2022-03-18 09:36 被阅读0次

固定算法,固定思路

  • 找到中间位置 midValue
  • 遍历数组,小与 midValue 放在 left,否则放在 right
  • 继续递归。最后 concat 拼接,返回

细节

  • 获取 midValue 的两种方式
  • 使用 splice,会修改原数组
  • 使用 slice,不会修改原数组 - 更加推荐

代码实现

方案1 splice

/**
 * 快速排序 - splice
 */
export const quickSort1 = (
  arr: number[]
): number[] => {
  if (!arr.length) return arr;

  const left: number[] = [];
  const right: number[] = [];
  const midIndex = Math.floor(arr.length / 2);
  const midValue = arr.splice(midIndex, 1)[0];

  // splice会修改数组,需要实时获取数组的大小
  for (let i = 0; i < arr.length; i ++) {
    const n = arr[i];

    if (n < midValue) {
      // 小于 midValue 放在 left
      left.push(n);
    } else {
      // 大于 midValue 放在 right
      right.push(n);
    }
  }

  return quickSort1(left).concat(
    [midValue],
    quickSort1(right)
  );
}

方案2 slice

/**
 * 快速排序 - slice
 */
 export const quickSort2 = (
  arr: number[]
): number[] => {
  const len = arr.length;
  if (!len) return arr;

  const left: number[] = [];
  const right: number[] = [];
  const midIndex = Math.floor(len / 2);
  const midValue = arr.slice(midIndex, midIndex + 1)[0];

  for (let i = 0; i < len; i ++) {
    if (i !== midIndex) {
      const n = arr[i];
  
      if (n < midValue) {
        // 小于 midValue 放在 left
        left.push(n);
      } else {
        // 大于 midValue 放在 right
        right.push(n);
      }
    }
  }

  return quickSort2(left).concat(
    [midValue],
    quickSort2(right)
  );
}

功能测试

export const quickSortFunctionalTest = () => {
  const arr = [3, 2, 1, 4, 5, 7, 8];
  const res = quickSort2(arr);
  console.info(res); // [1, 2, 3, 4, 5, 7, 8]
}

单元测试

/**
 * 快速排序单元测试
 */
import { quickSort2 } from '../src/utils/quick-sort';

describe('快速排序', () => {
  test('正常情况', () => {
    const arr = [3, 2, 1, 4, 5, 7, 8];
    const res = quickSort2(arr);
    expect(res).toEqual([1, 2, 3, 4, 5, 7, 8]);
  });

  test('有负数', () => {
    const arr = [3, 2, 1, 4, -10, 5, 7, 8];
    const res = quickSort2(arr);
    expect(res).toEqual([-10, 1, 2, 3, 4, 5, 7, 8]);
  });

  test('数组元素都一样', () => {
    const arr = [1, 1, 1, 1];
    const res = quickSort2(arr);
    expect(res).toEqual([1, 1, 1, 1]);
  });

  test('空数组', () => {
    const arr: number[] = [];
    const res = quickSort2(arr);
    expect(res).toEqual([]);
  });
});

执行 yarn jest:

PASS  tests/quick-sort.test.ts
  快速排序
    ✓ 正常情况 (2 ms)
    ✓ 有负数 (1 ms)
    ✓ 数组元素都一样
    ✓ 空数组

性能分析

时间复杂度

for 循环一次遍历时间复杂度 O(n),二分 O(logn),嵌套后复杂度就是 O(nlogn)。常规排序,嵌套循环,复杂度是 O(n^2)

性能测试

使用两种算法分别对10W条数据的数组排序

export const quickSortPerformanceTest = () => {
  const arr1 = [];
  for (let i = 0; i < 10 * 10000; i++) {
    arr1.push(Math.floor(Math.random() * 1000));
  }
  console.time('quickSort1');
  quickSort1(arr1);
  console.timeEnd('quickSort1');

  const arr2 = [];
  for (let i = 0; i < 10 * 10000; i++) {
    arr2.push(Math.floor(Math.random() * 1000));
  }
  console.time('quickSort2');
  quickSort2(arr1);
  console.timeEnd('quickSort2');
}

执行结果:

  • quickSort1: 75.958984375 ms
  • quickSort2: 76.9580078125 ms

两个算法时间几乎相同,splice 和 slice 并没有区分出来

  • 排序算法本身的时间复杂度已经够高 O(n*logn)
  • 外加,splice 是逐步二分之后执行的,二分会快速削减数量级
  • 如果只是单独比较 splice 和 slice, 效果会非常明显

相关文章

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • TS数据结构与算法之快速排序

    固定算法,固定思路 找到中间位置 midValue 遍历数组,小与 midValue 放在 left,否则放在 r...

  • 排序算法6:快速排序

    数据结构与算法 快速排序为应用最多的排序算法,因为快速二字而闻名。快速排序和归并排序一样,采用的都是分治思想。 分...

  • 算法与数据结构路线图

    学习算法与数据结构,深刻理解计算机科学 排序算法:插入、冒泡、选择、希尔、快速、归并、堆排序、计数排序、桶排序、基...

  • 数据结构与算法——快速排序

    数据结构与算法——快速排序 快速排序,顾名思义,它速度很快,针对一般应用中各种不同的输入都要比其他排序算法快很多,...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 2018-06-30

    排序算法之堆排序 堆排序是利用堆的数据结构而设计的一种排序算法,堆排序是一种选择排序。可以利用数组的特点快速定位制...

  • (转)排序算法

    排序算法点这里 数据结构与算法——计数排序、桶排序、基数排序

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • Python 算法大全

    这个库涵盖了多种算法和数据结构的介绍,比如: 排序算法(冒泡排序、希尔排序、插入排序、桶排序、合并排序、快速排序、...

网友评论

      本文标题:TS数据结构与算法之快速排序

      本文链接:https://www.haomeiwen.com/subject/qbridrtx.html