diff算法 阮一峰_JavaScript实现十大排序算法

一 : 冒泡排序人们开始学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而, 从运行时间的角度来看,冒泡排序是最差的一个,接下来你会知晓原因冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至 正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。export function bubbleSort(arr: number[]) { for ...
摘要由CSDN通过智能技术生成

b844353044d04cf4955abe0607cf8cf0.png

一 : 冒泡排序

人们开始学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而, 从运行时间的角度来看,冒泡排序是最差的一个,接下来你会知晓原因

冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至 正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。

export function bubbleSort(arr: number[]) {
    
  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]) {
    
        ;[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
      }
    }
  }
  return arr
}

冒泡排序每一轮(外层循环) 会选出一个最小 或者最大的数组 放到数组最后

所以N 个 数字 只用 选N -1 次 =>外层循环 i<arr.length -1

内存循环 两两相比, 只用 比较 N - 1次 ,但是 外层循环已经找到的最值不用比较

所以 => 内层循环 j < arr.length - i -1

一幅图来描述 冒泡的工作流程

0d2dd279d0af5a22b0d925aaf20dcf16.png

二 :选择排序

选择排序算法是一种原址比较排序算法。 他解决了冒泡 交换次数过多的毛病,在冒泡排序中 需要交换 O(N^2) 次 但 选择排序中 只用交换 O(N)次

选择排序大致的思路是找到数据结构中的最小值并 将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。

export function selectionSort(arr: number[]) {
    
  let min = 0
  for (let i = 0; i < arr.length - 1; i++) {
    
    min = i
    for (let j = i + 1; j < arr.length; j++) {
    
      if (arr[j] < arr[min]) {
    
        min = j
      }
    }
    if (i !== min) {
    
      ;[arr[i], arr[min]] = [arr[min], arr[i]]
    }
  }
  return arr
}

选择排序的代码执行过程 如下图

c79568274574b683f264342bddc010e6.png

三 :插入排序

插入排序的思想十分的重要, 学会了他你才能学习 希尔排序,而 希尔排序 又是排序算法 历史上的一个转折点 他打破了 排序算法 时间复杂度平均不会低于 O(N^2) 的理论。

插入排序每次排一个数组项,以此方式构建最后的排序数组。假定第一项已经排序了。接着, 它和第二项进行比较——第二项是应该待在原位还是插到第一项之前呢?这样,头两项就已正确 排序,接着和第三项比较(它是该插入到第一、第二还是第三的位置呢),以此类推

export function insertionSort(arr: number[]) {
    
  for (let i = 1; i < arr.length; i++) {
    
    let j = i
    let temp = arr[i]
    //插入操作
    while (j > 0 && arr[j - 1] > temp) {
    
      arr[j] = arr[j - 1]
      j--
    }
    arr[j] = temp
  }
  return arr
}

插入排序的 过程 假设数组 [ 3 ,5 , 1, 4, 2]

一开始 把 3 当作 局部有序 , 把 5 拎出来 和 局部有序 数列比较 并插入

// 第一次 : 5 > 3 合理 进入下一次循环

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值