算法 | 优化冒泡排序(JS)
2019-03-14 16:04
106 查看
版权声明:转载时请说明作者与出处 https://blog.csdn.net/qq_36145914/article/details/88554886
若文章有任何纰漏或未涉及你想了解的内容,欢迎在评论提出,我会尽最快速度回复。
文章目录
若文章有任何纰漏或未涉及你想了解的内容,欢迎在评论提出,我会尽最快速度回复。
前言
冒泡排序是一种广为人知的排序方法,它的实现大致可以描述为“相邻元素两两比较,交换次序,每一轮交换决出当前最大/最小数,从而实现排序”
因为涉及两层循环,冒泡排序的最差时间复杂度为O(n²)。
而冒泡排序的最佳情况是,一次遍历,排序完毕,故其最好时间复杂度为O(n)。
但很多书籍在提到最好时间复杂度的同时,仅提供了原始冒泡排序。其在程序设计上并不能达到O(n),给很多初学者造成了困惑。
为达到O(n),我们需要对原始冒泡排序进行简单的优化
优化
对冒泡排序的优化很简单,只要在外层循环中加入flag量进行判断——若本轮遍历没有发生任何一次交换,则终止循环。
优化代码如下:
function bubbleSort(arr) { let loopTimes = 0 for (let i = 0, len = arr.length; i < len; i++) { let finished = true for (let j = 0, len = arr.length - i - 1; j < len; j++) { if (arr[j] > arr[j + 1]) { finished = false; temp = arr[j + 1] arr[j + 1] = arr[j] arr[j] = temp } } loopTimes++; if (finished) break } return loopTimes } let arr = [2, 3, 9, 4, 5] let res = bubbleSort(arr) console.log('loopTimes:' + bubbleSort(arr)) console.log('the Array after sorting:' + arr)
对比
-
未优化的循环次数:
-
优化后的循环次数:
进一步优化
冒泡算法还能更进一步优化。使用pos位置量记录本次交换最远元素,避免遍历末尾已排好序的序列,减少遍历的总步数。
function bubbleSort(arr) { let loopTimes = 0 // 循环计数器 let steps = 0 // 步数 let last = arr.length - 1; for (let i = 0, len = arr.length; i < len; i++) { let finished = true // flag let pos = 0; for (let j = 0, len = last; j < len; j++) { if (arr[j] > arr[j + 1]) { finished = false; temp = arr[j + 1] arr[j + 1] = arr[j] arr[j] = temp pos = j } steps++; } last = pos loopTimes++; if (finished) break } console.log(steps) return { loopTimes, steps } } let arr = [6, 4, 3, 5, 2, 1, 9, 10, 11, 12, 14, 15] let res = bubbleSort(arr) console.log('the Array after sorting:' + arr) console.log('steps:' + res.steps) console.log('loopTimes:' + res.loopTimes)
注意
上例中涉及到JS的存储方式问题,在JS中,引用类型如Array会在堆区申请内存空间。当将引用类型传入函数时,相当于申请一个指针指向相同的内存空间。对函数参数进行改动可能会影响原数组,具体规则如下:
function test(arr) { arr[0] = 1 // 改变内存空间中的数据 arr = [0,1,2,3] // 申请新的内存空间,不会影响原数组。 } let arr = [-1] test(arr)
如果你不希望当函数传入数组参数后,可能存在改变原内存空间的行为,你可以使用concat()方法拷贝值相同的临时数组,参与接下来的运算。
function test(arr) { let tempArr = array.concat() ..... }
附
相关文章推荐
- js基本算法:冒泡排序,二分查找的简单实例
- 校招算法之冒泡排序的优化
- 冒泡排序实现及算法优化(java)
- 最简单的排序算法之一冒泡排序----js实现
- 传统的三种排序以及冒泡排序的优化算法
- 【算法1】之冒泡排序极其优化
- 经典算法之二:冒泡排序及优化
- js 性能优化之算法和流程控制
- 看数据结构写代码(2) 选择排序 和 冒泡排序 算法优化
- JS 冒泡排序从学到优化
- 算法——排序之冒泡排序优化
- js 中的 一些简单算法(二)之 双层循环—冒泡排序
- js冒泡排序优化排序次数
- 排序算法-对冒泡排序的优化改进算法
- js冒泡排序及优化
- 冒泡排序及算法优化
- 《大话数据结构》读书笔记之冒泡排序和源码及优化算法源码
- 【算法导论-006】冒泡排序及其优化(BubbleSort)
- 【算法】冒泡排序--js实现
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)