技术分享
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)

鑫生活

总有人要赢,为什么不能是我
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)
  • 浅谈两数全等
  • JavaScript 进制转换
  • 数组去重和排序
    • 数组去重
      • Set 去重
      • 双重循环
      • reduce 去重
      • sort 去重
    • 排序
      • 冒泡排序
      • 冒泡排序优化
      • 插入排序
      • 快速排序
      • 归并排序
      • 堆排序
  • 数组扁平化
  • 斐波那契数列
  • webpack面试题
  • 手写bind,apply,call和new
  • vite面试题
  • svg和canvas的优缺点
  • TypeScript面试题
  • Vue常见面试题
  • JavaScript 数据结构
  • 面试
coderly
2021-03-14

数组去重和排序

# 数组去重和排序

# 数组去重

# Set 去重

function unique(arr) {
  return Array.from(new Set(arr))
}
// OR
function unique(arr) {
  return [...new Set(arr)]
}
1
2
3
4
5
6
7

# 双重循环

function unique(arr) {
  let result = []
  for (let i = 0; i < arr.length; i++) {
    let isHas = false
    for (let j = 0; j < result.length; j++) {
      if (arr[i] === result[j]) {
        isHas = true
        break
      }
    }
    if (!isHas) result.push(arr[i])
  }
  return result
}

// OR
function unique(arr) {
  let result = []
  for (let i = 0; i < arr.length; i++) {
    if (result.indexOf(arr[i]) === -1) result.push(arr[i])
  }
  return result
}

// OR
function unique(arr) {
  let result = []
  for (let i = 0; i < arr.length; i++) {
    if (!result.includes(arr[i])) result.push(arr[i])
  }
  return result
}

// OR
function unique(arr) {
  let result = []
  arr.forEach((element) => {
    // if (!result.includes(element)) result.push(element)
    // OR
    if (result.indexOf(element) === -1) result.push(element)
  })
  return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# reduce 去重

function unique(arr) {
  return arr.reduce((result, element, index) => {
    // if (!result.includes(item)) result.push(element)
    // OR
    if (result.indexOf(element) === -1) result.push(element)
    return result
  }, [])
}
1
2
3
4
5
6
7
8

# sort 去重

function unique(arr) {
  arr.sort((a, b) => a - b)
  if (arr.length === 1) return arr
  let result = [arr[0]]
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] !== arr[i - 1]) {
      result.push(arr[i])
    }
  }
  return result
}
1
2
3
4
5
6
7
8
9
10
11

# 排序

# 冒泡排序

function BubbleSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) swap(arr, j, j + 1)
    }
  }
}

function swap(arr, i, j) {
  ;[arr[i], arr[j]] = [arr[j], arr[i]]
}
1
2
3
4
5
6
7
8
9
10
11

# 冒泡排序优化

function BubbleSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    let isSwap = false
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        isSwap = true
        swap(arr, j, j + 1)
      }
    }
    if (!isSwap) break // 如果没有再交换元素了,表明已经有序,不需要继续遍历
  }
}

function swap(arr, i, j) {
  ;[arr[i], arr[j]] = [arr[j], arr[i]]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 插入排序

function insertSort(arr) {
  let i, j, len
  len = arr.length
  for (i = 1; i < len; i++) {
    for (j = i; j > 0; j--) {
      if (arr[j - 1] > arr[j]) {
        swap(arr, j - 1, j)
      } else {
        break
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 快速排序

function fastSort(arr) {
  function sort(arr, left, right) {
    if (left >= right) return
    let index = findIndex(arr, left, right)
    sort(arr, left, index)
    sort(arr, index + 1, right)
  }
  function findIndex(arr, left, right) {
    if (left > right) return
    let key = arr[left]
    let low = left
    while (left < right) {
      while (key < arr[right] && left < right) {
        right--
      }
      while (arr[left] <= left && left < right) {
        left++
      }
      if (left < right) {
        swap(arr, left, right)
      }
    }
    swap(arr, low, right)
    return left
  }
  sort(arr, 0, arr.length - 1)
}
function swap(arr, i, j) {
  ;[arr[i], arr[j]] = [arr[j], arr[i]]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 归并排序

function mergeSort(arr) {
  let len = arr.length
  if (len <= 1) {
    return arr
  }
  let mid = parseInt(len / 2)
  let left = arr.slice(0, mid)
  let right = arr.slice(mid)
  return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right) {
  let arr = []
  while (left.length && right.length) {
    if (left[0] < right[0]) {
      arr.push(left.shift())
    } else {
      arr.push(right.shift())
    }
  }
  while (left.length) {
    arr.push(left.shift())
  }
  while (right.length) {
    arr.push(right.shift())
  }
  return arr
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 堆排序

  • 构建堆
  • 交换第一个和最后一个的位置,并重新构建堆
  1. 大顶堆

升序

// 堆排序
function HeapSort(arr) {
  for (let i = arr.length / 2; i >= 0; i--) {
    // 构建堆
    buildHeap(arr, i, arr.length)
  }
  // 开始排序
  for (let i = arr.length - 1; i > 0; i--) {
    //交换第一个和最后一个的位置
    swap(arr, 0, i)
    // 交换位置之后重新构建堆
    buildHeap(arr, 0, i)
  }
}
// 构建堆 - 大顶堆
function buildHeap(arr, i, len) {
  let parent = arr[i]
  let child = 2 * i + 1
  while (child < len) {
    if (child + 1 < len && arr[child + 1] > arr[child]) child = child + 1
    if (arr[child] <= parent) break
    arr[i] = arr[child]
    i = child
    child = 2 * i + 1
  }
  arr[i] = parent
}

function swap(arr, i, j) {
  ;[arr[i], arr[j]] = [arr[j], arr[i]]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  1. 小顶堆

降序

// 堆排序
function HeapSort(arr) {
  for (let i = arr.length / 2; i >= 0; i--) {
    // 构建堆
    buildHeap(arr, i, arr.length)
  }
  // 开始排序
  for (let i = arr.length - 1; i > 0; i--) {
    //交换第一个和最后一个的位置
    swap(arr, 0, i)
    // 交换位置之后重新构建堆
    buildHeap(arr, 0, i)
  }
}
// 构建堆 - 小顶堆
function buildHeap(arr, i, len) {
  let parent = arr[i]
  let child = 2 * i + 1
  while (child < len) {
    if (child + 1 < len && arr[child + 1] < arr[child]) child = child + 1
    if (arr[child] >= parent) break
    arr[i] = arr[child]
    i = child
    child = 2 * i + 1
  }
  arr[i] = parent
}

function swap(arr, i, j) {
  ;[arr[i], arr[j]] = [arr[j], arr[i]]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
上次更新: 2021/09/13, 15:11:59
JavaScript 进制转换
数组扁平化

← JavaScript 进制转换 数组扁平化→

最近更新
01
css
09-13
02
html
09-13
03
README
09-13
更多文章>
Theme by Vdoing | Copyright © 2021-2021 coderly | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式