以下内容若有问题烦请即时告知我予以修改,以免误导更多人。
这篇真的写的相当好,我记得有一次见过bat的面试题是要把算法过程以柱状图形势展现。
十大经典排序算法总结(JavaScript描述)
1. 查找算法
以有序数组查找定值为例
(1) 线性查找
循环遍历比较
eg: findInArr
1 | <script> |
(2) 二分法查找
从中间开始,往左右两边查找
1 | <script> |
二分法应用
掌握二分法的核心思想:从中间开始,往左右两边查找
无序数组查找最小值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<script>
var arr = [1, 2, -4, -11, 13];
function findMin(arr, s, e) {
if (s > e) {
return false;
} else if (s == e) {
return arr[s];
}
var c = Math.floor((s + e) / 2);
var l = findMin(arr, s, c); // 先找左侧最小值
var r = findMin(arr, c + 1, e); // 再找右侧最小值
if (l < r) { // 两侧最小值比较
return l;
} else {
return r;
}
}
console.log(findMin(arr, 0, arr.length - 1));
</script>二分法数组去重
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35<script>
var arr = [1, 2, 3, 2, 4, 3, 1, 5, 7, 2, 5];
// 数组内查找元素是否存在
function findInArr(item, arr) {
for (var i = 0; i < arr.length; i++) {
if (item == arr[i]) {
return true;
}
}
return false;
}
function del(arr, s, e) {
if (s > e) {
return [];
} else if (s == e) {
return [arr[s]];
}
var c = Math.floor((s + e) / 2);
var l = del(arr, s, c);
var r = del(arr, c + 1, e);
for (var i = 0; i < r.length; i++) {
if (!findInArr(r[i], l)) {
l.push(r[i]);
}
}
return l;
}
console.log(del(arr, 0, arr.length - 1));
</script>二分法数组排序(归并排序)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<script>
var arr = [3, 1, 4, 6, 5, 7, 2, 11];
function _sort(arr, s, e) {
if (s > e) {
return [];
} else if (s == e) {
return [arr[s]];
}
var c = Math.floor((s + e) / 2);
var l = _sort(arr, s, c);
var r = _sort(arr, c + 1, e);
var arr2 = [];
while (l.length > 0 || r.length > 0) {
if (l[0] < r[0]) {
arr2.push(l.shift());
} else {
arr2.push(r.shift());
}
}
return arr2;
}
</script>
2. 排序算法
(1) 交换排序
冒泡排序
每一轮循环内比较相邻的两个数,如果后一个比前一个小,互换位置。
- 时间复杂度:O(n^2)
1 | <script> |
快速排序
采用二分法,取出中间数,数组每次和中间数比较,小的放到左边,大的放到右边。
左边和右边再同理比较。
- 时间复杂度:O(nlog2(n))
1 | <script> |
(2) 选择排序
直接选择
每次从当前位置,往后查找最小值,与当前位置交换。
- 时间复杂度:O(n^2)
1 | <script> |
堆排序
堆排序用到二叉树的概念。
- 时间复杂度:O(nlog2(n))
1 | <script> |
(3) 归并排序
采用二分法,左边一个排序好的数组,右边一个排序好的数组,每次比较左右数组的第一个数,小的放到一个新的数组中。
- 时间复杂度:O(nlog2(n))
1 | <script> |
3. 数据结构
- 时间复杂度
- 空间复杂度
(1) 有序数组
(2) 无序数组
不重复
1 | <script> |
(3) 二叉树
增加、查找
以第一个树为根节点,新进来的数比谁小跟谁近就放在谁下面
1 | 根 |
1 | <script> |
(4) 队列
特点:先进先出,后进后出
(5) 堆栈
特点:后进先出,先进后出
(6) 散列
存的时候先开辟一块空间出来
1 | <script> |
更多内容可以订阅本人微信公众号,一起开启前端小白进阶的世界!