zoukankan      html  css  js  c++  java
  • js数组排序算法 快速排序法

    原理:

    判断元素个数,若元素为空或只有1个元素,则无需排序。

    否则就将第一个元素作为基准值,将数组拆分为2个数组,一个大于基准值的,一个小于基准值的。

    利用递归算法,继续将上面的2个数组分别继续执行,即可得到全部排序过的新数组。

    快速排序是冒泡排序的改进版。

    js实现代码:

    // 快速排序
    function qsort(arr) {
      if (arr.length < 2) {// 没有元素或只有1个元素 无需排序
        return arr;
      } else {
        const piv = arr[0] // 第一个元素作为基准值
        let Larr = [], Rarr = []; //左侧 < 基准值数组 右侧 > 基准值数组
        for (let i = 1; i < arr.length; i++) {
          if (arr[i] < piv) {
            Larr.push(arr[i])
          } else {
            Rarr.push(arr[i])
          }
        }
        // 递归调用qsort 结果返回新数组
        return [...qsort(Larr), piv, ...qsort(Rarr)]
      }
    }
    const arr = qsort([5, 6, 100, 30, 50, 10, 1, 5, 3, 9, 10])
    console.log(arr) // [1, 3, 5, 5, 6, 9, 10, 10, 30, 50, 100]

    此时大O为O(n),因为存在递归,需要开新栈空间,有空间复杂度。

    大O更小的一种方式是每次都将中间一个元素作为基准值,也就是配合二分法,这样每次for的次数将减少一半,大O为O(logn)

    欢迎一起交流!
    【http://wuhairui.cnblogs.com/】

  • 相关阅读:
    Java基础知识回顾
    设计模式简单回顾
    数据结构基础知识
    《More Effective C#》读书笔记
    《Effective C#》读书笔记
    《编程匠艺》读书笔记
    《Scrum实战》读书会作业01
    开始一段新的敏捷学习之旅 —— IT帮读书会第4期《Scrum实战》
    【译】别学框架,学架构
    AngularJS学习笔记(1)
  • 原文地址:https://www.cnblogs.com/wuhairui/p/14848612.html
Copyright © 2011-2022 走看看