数据结构(九)-排序和搜索算法
排序算法
排序算法动画图示网站:
https://visualgo.net/zh/sorting
冒泡排序
冒泡排序会比较所有两个相邻的项,如果第一个比第二个大,则交换他们。元素向上移动到正确顺序,就好像气泡升至表面。
优点:简单
缺点:运行时间长
复杂度O(n*n)
1 | |
图示第一个算法过程
改进之后的算法过程
选择排序
性能较差
复杂度O(n*n)
1 | |

插入排序
插入排序在小型数组效率比冒泡和选择排序性能好
1 | |

归并排序
参考:https://www.cnblogs.com/chengxiao/p/6194356.html
插入排序,冒泡排序,选择排序性能并不好,归并排序性能不错,复杂度为O(nlog(n)。
归并排序是一种分而治之的算法。其思想是将原始数组切分为娇小的数组,直到每一个小数组只有一个位置,接着将小数组归并为较大的数组,直到最后只有一个排序完毕的大数组。
分而治之:将问题分解为较小的子问题递归求解,直到它们变得足够简单以至可以直接解决为止。
1 | |


快速排序
最常用的排序算法。
复杂度为O(nlog(n)),同样使用分而治之思想。
https://wiki.jikexueyuan.com/project/easy-learn-algorithm/fast-sort.html
1 | |
Array.prototype.sort的实现原理
在JS中,有一个sort方法可以用来给数组排序,原理就是利用归并排序和快速排序。
在火狐浏览器中使用的是归并排序。
在V8中使用的是快速排序的变体
计数排序
计数排序是一种分布式排序算法,主要是计算元数组中每个出现的次数加入到新数组,然后遍历新数组还原。
时间复杂度O(n+k),k是临时计数数组的大小,缺点是需要更多的内存来存放临时数组。
1 | |

桶排序
基数排序
搜索算法
顺序搜索(线性搜索)
将每一个数据结构中的元素和我们要找的元素做比较,是一种最低效的搜索算法。
1 | |
二分搜索
要求数组是一个升序的有序数组。
算法步骤:
- 选择数组中间的值
- 如果选中值是待搜索值,算法执行完毕
- 如果待搜索值比选中值要小,返回步骤一并在左边子数组中寻找(较小)
- 如果待搜索值比选中值要大,返回步骤一并在右边子数组中寻找(较大)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23const DOES_NOT_EXIST = -1
function lesserOrEquals(a, b, compareFn) {
const comp = compareFn(a, b)
return comp === Compare.LESS_THAN || comp === Compare.EQUALS
}
function binarySearch(array, value, compareFn = defaultCompare) {
// 二分搜索的数组需要是一个升序的数组,先排序
const sortedArray = quickSort(array)
let low = 0;
let high = sortedArray.length - 1
while(lesserOrEquals(low, high, compareFn)){ // 如果low不比high大
const mid = Math.floor((low + high) / 2) // 获取到中间的下标
const element = sortedArray[mid] // 获取到中间的值
if (compareFn(element, value) === Compare.LESS_THAN) { // 中间值比待搜索值比较小,从右边开始搜索
low = mid + 1
} else if (compareFn(element, value) === Compare.BIGGER_THAN) { // 中间值比待搜索值比较大,从左边开始搜索
high = mid - 1
} else {
return mid
}
}
return DOES_NOT_EXIST
}
本文标题:数据结构(九)-排序和搜索算法
文章作者:Niuhk
发布时间:2022-02-18
最后更新:2022-03-22
原始链接:https://www.niuhk.cn/2022/02/18/数据结构(九)-排序和搜索算法/
版权声明:转载请注明出处!
分享