用 JavaScript 动手敲一敲经典排序算法

做前端一直没怎么接触算法之类,看到一篇文章 - 十大经典排序算法总结(JavaScript描述)

学习过程中动手敲一敲其中的示例,接下来记录一下用 js 实现经典排序算法的过程。

冒泡排序(Bubble Sort)

冒泡排序,我的理解就是循环判断当前的数字和下一个数字的大小,如果当前大于下一个,则把当前的放到后面。这样子,排序完成后最后一个就是最大的数字。就像是气泡从水底冒上来一样。

const array = [10, 2, 23, 123, 12, 32, 34, 56, 1, 98, 11, 22, 33, 298, 4]

function sort (array) {
  let result = [...[], ...array]
  let count = 0

  for (let i = 0; i < result.length; i++) {
    for (let j = 0; j < result.length; j++) {
      if (result[j] > result[j + 1]) {
        const currentNumber = result[j]
        const nextNumber = result[j + 1]

        result[j] = nextNumber
        result[j + 1] = currentNumber
      }
      count++
    }
  }

  console.log('count', count) // 225
  console.log(result) // [ 1, 2, 4, 10, 11, 12, 22, 23, 32, 33, 34, 56, 98, 123, 298 ]
}

sort(array)

冒泡排序最坏情况的时间复杂度是 (n²)。那么,优化一下。试想一下,冒泡排序时是从第一个开始,到最后一个。那经历一次循环后,最后一个肯定是最大的数。下一次排序则没必要比较最后一个,以此类推。接下来,改进的过程中,记录下最后一次比较的位置,下一次比较这个位置后面的就不去比较了。

const array = [10, 2, 23, 123, 12, 32, 34, 56, 1, 98, 11, 22, 33, 298, 4]

function sort (array) {
  let result = [...[], ...array]
  let lastExchangePosition = result.length
  let exchangePosition = 0
  let count = 0

  for (let i = 0; i < result.length; i++) {
    for (let j = 0; j < lastExchangePosition; j++) {
      if (result[j] > result[j + 1]) {
        const currentNumber = result[j]
        const nextNumber = result[j + 1]

        result[j] = nextNumber
        result[j + 1] = currentNumber

        exchangePosition = j
      }
      count++
    }
    lastExchangePosition = exchangePosition
  }

  console.log('count', count) // 109
  console.log(result) // [ 1, 2, 4, 10, 11, 12, 22, 23, 32, 33, 34, 56, 98, 123, 298 ]
}

sort(array)

优化前的时间复杂度是15²=225,优化后的时间复杂度为123,少了一半。

选择排序(Selection Sort)

选择排序的原理是,从头开始循环去找最小或者最大的数,找到后与数组首位数交换。下一次则从下一个数字开始去查找最小的数,再次交换。其时间复杂度是(n-1)!。

const array = [10, 2, 23, 123, 12, 32, 34, 56, 1, 98, 11, 22, 33, 298, 4]

function sort (array) {
  let result = [...[], ...array]
  let count = 0
  let minNumberIndex = 0

  for (let i = 0; i < result.length; i++) {
    minNumberIndex = i

    for (let j = i + 1; j < result.length; j++) {
      minNumberIndex = result[j] < result[minNumberIndex] ? j : minNumberIndex
      count++
    }

    const minNumber = result[minNumberIndex]
    const currentNumber = result[i]

    result[minNumberIndex] = currentNumber
    result[i] = minNumber
  }

  console.log('count', count) //  ( 15 - 1 )! = 105
  console.log(result) // [ 1, 2, 4, 10, 11, 12, 22, 23, 32, 33, 34, 56, 98, 123, 298 ]
}

sort(array)

插入排序(Insertion Sort)

插入排序简单的应用场景就是打扑克牌,从第二张牌开始,向前面的牌去一一比较,找到插入的位置后将其插入。

const array = [10, 2, 23, 123, 12, 32, 34, 56, 1, 98, 11, 22, 33, 298, 4]

function sort (array) {
  let result = [...[], ...array]
  let count = 0

  for (let i = 1; i < result.length; i++) {
    const current = result[i]
    let j = i - 1

    while (current < result[j] && j >= 0) {
      result[j + 1] = result[j]
      j--
      count++
    }
    result[j + 1] = current
  }

  console.log('count', count) // 44
  console.log(result) // [ 1, 2, 4, 10, 11, 12, 22, 23, 32, 33, 34, 56, 98, 123, 298 ]
}

sort(array)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 搞懂基本排序算法 上篇文章写了关于 Java 内部类的基本知识,感兴趣的朋友可以去看一下:搞懂 JAVA 内部类;...
    醒着的码者阅读 1,317评论 3 4
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an输出...
    BULL_DEBUG阅读 851评论 0 3
  • 最近很多人说《欢乐颂2》追不下去了,各个网站打分也很低。但我还在断断续续地看,甚至常看得泪流满面。 我很乐于看到在...
    冯尘阅读 414评论 0 2
  • 感恩此刻听到办公室笑声,随喜好开心哒!还有小唐说话好可爱每次想笑,袁姐想去住到山里不回家,哈哈,太好玩儿了,谢谢 ...
    喜悦的小莉阅读 128评论 0 0
  • 我今年二十出头,还没有经历过太多的生死离别,也没有劫后余生的大彻大悟,在谈及生命时总觉得其包含的沉甸甸的含义让人敬...
    长安月落阅读 396评论 1 1

友情链接更多精彩内容