>[success] # 冒泡排序
~~~
1.冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移
动至 正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名
2.如图冒泡排序会将排序好的结果至于末尾,是一个从后向前的过程
~~~
![](https://box.kancloud.cn/b7d216a5b292cf3a5412bbc7fbb56a9e_826x257.gif)
![](https://img.kancloud.cn/f6/84/f6848d124513bcb18ea7d618bf5b9cc7_1004x958.png)
>[info] ## 代码实现
>[danger] ##### 根据纯概念实现
~~~
// 生成随机数数组
function randomArray(max, min, len) {
let randomNum = 0
const array = []
for (let i = 0; i < len; i++) {
randomNum = Math.floor((Math.random() * (max - min + 1)) + min)
array.push(randomNum)
}
return array
}
const array = randomArray(1, 10, 5)
// 冒泡排序
const Compare = {
LESS_THAN: -1,
BIGGER_THAN: 1,
EQUALS: 0
};
function defaultCompare(a, b) {
if (a === b) {
return Compare.EQUALS;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
function swap(array, a, b) {
/* const temp = array[a];
array[a] = array[b];
array[b] = temp; */
[array[a], array[b]] = [array[b], array[a]];
}
function bubbleSort(array, compareFn = defaultCompare) {
const {
length
} = array
for (let i = 0; i < length; i++) {
for (let j = 0; j < length - 1; j++) {
if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) {
swap(array, j, j + 1)
}
}
}
}
bubbleSort(array)
console.log(array)
~~~
>[danger] ##### 优化
~~~
1.这里做了一个小改动'length-1-i',因为在概念上已经说了是相邻的进行比较,所以在每一轮的时候对应末尾位置数据
已经排序好了,已经拍好的位置就不用相邻位置进行比较了,因此做了这个改动
2.但无论怎么改动都改变不了冒泡排序速度慢的事实,运行就是O(n2)。
~~~
~~~
function bubbleSort(array, compareFn = defaultCompare) {
const {
length
} = array
for (let i = 0; i < length - 1; i++) {
// 这里做优化
for (let j = 0; j < length - 1 - i; j++) {
if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) {
swap(array, j, j + 1)
}
}
}
}
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构