Web高级 JavaScript中的算法
2020-12-13 02:25
标签:method 其他 why 先后 方法递归 而且 receive objects als 温故而知新,最新在复习数据结构和算法,结合Chrome的V8源码,看看JS中的一些实现。 我们先看看各浏览器的排序算法是否是稳定排序 在V8 v7.0/Chrome70以后,源码不在包含/src/js目录,相应的迁移到了/src/torque Web高级 JavaScript中的算法 标签:method 其他 why 先后 方法递归 而且 receive objects als 原文地址:https://www.cnblogs.com/full-stack-engineer/p/11037580.html算法
排序算法
待排序序列中相等元素在排序完成后,原有先后顺序不变。
待排序序列中有序关系的元素对个数。1. 插入排序
2. 选择排序
3. 归并排序
4. 快速排序
5. 桶排序
6. 基数排序
7. 二分查找
JavaScript字符串查找算法
首先我们看看字符串查找在V8中是使用的哪种算法。
我们知道JS中的String是继承于Object,源码如下:// https://github.com/v8/v8/blob/master/src/objects/string.cc
// Line942 字符串查找方法定义
int String::IndexOf(Isolate* isolate, Handle
JavaScript数组排序算法
关于V8 Torque的详情可以参考V8 Torque我们先看看Chrome70以前的Array.prototype.sort的实现
// https://github.com/v8/v8/blob/6.9.454/src/js/array.js
// Line 802
// 以下可以知道sort方法返回InnerArraySort结果
DEFINE_METHOD(
GlobalArray.prototype,
sort(comparefn) {
if (!IS_UNDEFINED(comparefn) && !IS_CALLABLE(comparefn)) {
throw %make_type_error(kBadSortComparisonFunction, comparefn);
}
var array = TO_OBJECT(this);
var length = TO_LENGTH(array.length);
return InnerArraySort(array, length, comparefn);
}
);
// Line645
// 我们接下来看InnerArraySort的定义
function InnerArraySort(array, length, comparefn) {
// In-place QuickSort algorithm.
// For short (length = from; j--) {
var tmp = a[j];
var order = comparefn(tmp, element);
if (order > 0) {
a[j + 1] = tmp;
} else {
break;
}
}
a[j + 1] = element;
}
};
// ...省略部分代码
function QuickSort(a, from, to) {
var third_index = 0;
while (true) {
// Insertion sort is faster for short arrays.
if (to - from
快排所带来的问题
再看看Chrome70以后的排序实现
// https://github.com/v8/v8/blob/4b9b23521e6fd42373ebbcb20ebe03bf445494f9/third_party/v8/builtins/array-sort.tq
// Line1236
transitioning macro
ArrayTimSortImpl(context: Context, sortState: SortState, length: Smi) {
if (length = all in [low, left).
// pivot > 1);
const order = sortState.Compare(pivot, workArray.objects[mid]);
if (order = all in [low, left) and
// pivot left; --p) {
workArray.objects[p] = workArray.objects[p - 1];
}
workArray.objects[left] = pivot;
}
}
// Regardless of invariants, merge all runs on the stack until only one
// remains. This is used at the end of the mergesort.
transitioning macro
MergeForceCollapse(context: Context, sortState: SortState) {
let pendingRuns: FixedArray = sortState.pendingRuns;
// Reload the stack size becuase MergeAt might change it.
while (GetPendingRunsSize(sortState) > 1) {
let n: Smi = GetPendingRunsSize(sortState) - 2;
if (n > 0 &&
GetPendingRunLength(pendingRuns, n - 1)