XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • 算法图解阅读笔记
  • MD5算法
  • JS实现常见排序
    • 邓俊辉算法与数据结构
    • JS实现队列
    • JS实现树的几种遍历方式
    • 二叉树相关
    • 哈希算法
    • 进制转换与js实现
    • JS实现链表
    • JS实现栈与栈应用
    • 算法与数据结构
    XingYun
    2022-03-26
    目录

    JS实现常见排序

    JS 实现常见排序算法

    # 工具

    生成测试数据

    
    function generateTestArr(num) {
      const arr = []
      for (let index = 0; index < num; index++) {
        arr.push(Math.round(Math.random() * num))
      }
      return arr
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    在下面的测试算法例子中 都是用的固定的 1w 个数字组成的数组,数字取值范围为 0-1w

    计算排序算法运行时间

    function getProcessTime(algoFunc, arr) {
      console.time('排序耗时')
      const res = algoFunc(arr)
      console.timeEnd('排序耗时')
      return res
    }
    
    1
    2
    3
    4
    5
    6

    # 冒泡排序(Bubble Sort)

    
    function bubbleSort(arr) {
      if (arr.length < 2) return arr
      const len = arr.length
      for (let index = 0; index < len; index++) {
        for (let i = 0; i < len - index - 1; i++) {
          if (arr[i] > arr[i + 1]) {
            const temp = arr[i]
            arr[i] = arr[i + 1]
            arr[i + 1] = temp
            // ;[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
          }
        }
      }
      return arr
    }
    
    console.log(bubbleSort([1, 4, 3, 2, 12, 5])) // [ 12,  5, 4, 3,  2,  1]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    # 选择排序(Selection Sort)

    function selectionSort(arr) {
      const len = arr.length
      for (let index = 0; index < len; index++) {
        let maxIndex = index
        for (let i = index + 1; i < len; i++) {
          if (arr[i] > arr[maxIndex]) {
            const temp = arr[i]
            arr[i] = arr[maxIndex]
            arr[maxIndex] = temp
          }
        }
      }
      return arr
    }
    
    console.log(selectionSort([22,-1,19,1, 4, 3, 2, 12, 5])) //[ 22, 19, 12,  5, 4, 3,  2,  1, -1]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    # 插入排序(Insertion Sort)

    # 归并排序

    主要采用分而治之的思想

    function merge(arr1, arr2) {
      var result = []
      while (arr1.length > 0 && arr2.length > 0) {
        if (arr1[0] > arr2[0]) {
          /*shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。*/
          result.push(arr1.shift())
        } else {
          result.push(arr2.shift())
        }
      }
      return result.concat(arr1).concat(arr2)
    }
    
    function mergeSort(arr) {
      let len = arr.length
      if (len < 2) {
        return arr
      }
      let middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle)
      return merge(mergeSort(left), mergeSort(right))
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    # 插入排序(Insertion Sort)

    function insertionSort(array) {
      for (let i = 1; i < array.length; i++) {
        let max = array[i]
        let j = i - 1
        while (j >= 0 && array[j] > max) {
          array[j + 1] = array[j]
          j--
        }
        array[j + 1] = max
      }
      return array
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # 希尔排序(Shell Sort)

    function shellSort(arr) {
      var len = arr.length,
        temp,
        gap = 1
      while (gap < len / 5) {
        //动态定义间隔序列
        gap = gap * 5 + 1
      }
      for (gap; gap > 0; gap = Math.floor(gap / 5)) {
        for (var i = gap; i < len; i++) {
          temp = arr[i]
          for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
            arr[j + gap] = arr[j]
          }
          arr[j + gap] = temp
        }
      }
      return arr
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    # 快速排序(Quick Sort)

    function quickSort(array, left = 0, right = array.length - 1) {
      if (left < right) {
        let x = array[right],
          i = left - 1,
          temp
        for (let j = left; j <= right; j++) {
          if (array[j] <= x) {
            i++
            temp = array[i]
            array[i] = array[j]
            array[j] = temp
          }
        }
        quickSort(array, left, i - 1)
        quickSort(array, i + 1, right)
      }
      return array
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    console.log(getProcessTime(quickSort)) // 排序耗时 5.805ms
    console.log(getProcessTime(shellSort)) // 排序耗时: 6.728ms
    console.log(getProcessTime(mergeSort)) // 排序耗时: 22.491ms
    console.log(getProcessTime(insertionSort)) // 排序耗时: 43.305ms
    console.log(getProcessTime(bubbleSort)) // 排序耗时: 144.391ms
    console.log(getProcessTime(selectionSort)) // 排序耗时: 179.81ms

    #算法
    上次更新: 2023/04/05, 09:41:10
    MD5算法
    邓俊辉算法与数据结构

    ← MD5算法 邓俊辉算法与数据结构→

    最近更新
    01
    JavaScript-test
    07-20
    02
    二维码的原理
    07-20
    03
    利用ChatGPT优化代码
    07-20
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式