temp = arr[i];
for (var j = 0; j < i; j++){//找到插入位置
index = i;
if (arr[j] > temp){
index = j;//找到的插入点索引
break;
}
}
if (i != index){
for (var j = i; j > index; j–)//插入该值
[arr[j - 1], arr[j]] = [arr[j],arr[j - 1]];
}
arr[index] = temp;
}
}
快速排序
这个想必大家都耳熟能详,20世纪十大经典算法之一。主要原因还是它极大的推动了信息技术的发展,可惜它不是稳定算法。
这个算法比较就比较难理解了,它通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的任一数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。这里面包含的分治的思想。
下面一个图表现了函数的一次执行过程:
而这个图表现了整个排序过程:
插入排序时间复杂度为 O(nlogn) O ( n l o g n ) O(nlogn),空间复杂度为 O(logn) O ( l o g n ) O(logn),属于 不稳定 排序。
快速排序(前轴)
function quickSort(arr){
qSort(0, arr.length - 1);
return arr;
function qSort(left, right){
if (left >= right)//两个数相遇则结束该轮排序
return;
var key = arr[left];//取最左边的元素作为标识数
var i = left;
var j = right;
while (i != j){//两个数相遇则结束该轮排序
while (i != j && arr[j] >= key) j–;//j前移
[arr[j], arr[i]] = [arr[i], arr[j]];
while (i != j && arr[i] <= key) i++;//i后移
[arr[j], arr[i]] = [arr[i], arr[j]];
}
qSort(left, j - 1);//对标识数前面的数继续该方法排序
qSort(j + 1, right);//对标识数后面的数继续该方法排序
}
}
这里补充一下:快速排序由于其实轴的选择不同,分为前轴、中轴、后轴快速排序,上面的例子是前轴快速排序,下文比较算法的时候也才用上述代码。不过,这里补充另外2种代码:
//中轴快速排序
function quickSortM(arr){
qSort(0, arr.length - 1);
return arr;
function qSort(left, right){
if (left < right){
var index = Math.floor((left + right) / 2);
var key = arr[index];
var i = left - 1;
var j = right + 1;
while (true){
while (arr[++i] < key); // 向右找大于轴的数
while (arr[–j] > key); // 向左找小于轴的数
if (i >= j)//两索引相同结束排序
break;
[arr[i], arr[j]] = [arr[j],arr[i]];//交换找到的数
}
qSort(left, i - 1); // 继续这样对轴前面的排序
qSort(j + 1, right); // 继续这样对轴后面的排序
}
}
}
//后轴快速排序
function quickSortB(arr){
qSort(0, arr.length - 1);
return arr;
function qSort(left, right){
if (left >= right)//两索引相同结束排序
return;
var key = arr[right];
var i = left - 1;//s是最右边的轴
for (var j = left; j < right; j++){ //将数据分成大于轴和小于轴两部分
if (arr[j] <= key){
i++;
[arr[i], arr[j]] = [arr[j],arr[i]];
}
}
i++;
[arr[right], arr[i]] = [arr[i],arr[right]];//将轴插入到大于轴和小于轴两部分的中间
qSort(left, i - 1);//继续这样对轴前面的排序
qSort(i, right);//继续这样对轴后面的排序
}
}
归并排序
这个排序在小编眼里用的是最广泛的,很多函数封装内部都才用这个排序,包括数据库在内的排序也采用了归并排序或红黑树的形式。这个排序也用到了分治的思想:它将一个序列逐级拆分成小序列,将小序列排序后合并,得到完全有序的序列。若每次将序列分成2个子序列,再依此合并,称为二路归并。
没理解?看图:
插入排序时间复杂度为 O(nlogn) O ( n l o g n ) O(nlogn),空间复杂度为 O(n) O ( n ) O(n),属于 稳定 排序。
//归并排序
function mergeSort(arr){
var temp = [];
merge(0, arr.length - 1);
return arr;
function merge(left, right){//temp是临时空间,存放排序过程中间结果
var mid;//该部分中间位置
if (left >= right)//分组小于等于1时归并结束
return;
mid = Math.floor((left + right) / 2);
merge(left, mid);//对中间位置之前部分继续该方法排序
merge(mid + 1, right);//对中间位置之后部分继续该方法排序
var i = left, j = mid + 1, k = left;
while (i != mid + 1 && j != right + 1)//比较两部分每个值,把较小的放入temp中,并后移该指针,直到某部分全部遍历
temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
//将未全部遍历部分数据顺次放入temp中
while (i != mid + 1)
temp[k++] = arr[i++];
while (j != right + 1)
temp[k++] = arr[j++];
//将temp复制会a中
for (i = left; i <= right; i++)
arr[i] = temp[i];
}
}
希尔排序
这是惟一一个用人名命名的排序算法。它把数据按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
这个估计最不好理解了,看看图吧:
希尔排序时间复杂度为 O(n13) O ( n 1 3 ) O(n^\frac1{3}),空间复杂度为 O(1) O ( 1 ) O(1),属于 不稳定 排序。
//希尔排序
shellSort = function(arr){
var len = arr.length;
var index = Math.floor(len / 2);//得到比较步长
var j, temp;
while (index > 0){
for (var i = index; i < len; i++){//遍历起点后移,保证每个数在该步长下参与且只参与1此排序
temp = arr[i];
for (j = i; j >= index && arr[j - index] > temp;){//等步长数列执行插入排序
arr[j] = arr[j - index];
j -= index;
arr[j] = temp;
}
}
index = Math.floor(index / 2);//步长减半
}
}
堆排序
首先说一下一个名词:大根堆。大根堆的要求是每个节点的值都不大于其父节点的值,即 A[PARENT[i]]≥A[i] A [ P A R E N T [ i ] ] ≥ A [ i ] A[PARENT[i]] \geq A[i], 属于完全二叉树。
根据大根堆的要求可知,最大的值一定在堆顶,根据其特点,如果要求每个节点的左孩子小于右孩子,得到的就是数据从小到大的排列。反之从大到小排列应该使用小根堆。
如果你对二叉树熟悉的话,可以简单用图理解一下
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
最后
推荐一些系统学习的途径和方法。
每个Web开发人员必备,很权威很齐全的Web开发文档。作为学习辞典使用,可以查询到每个概念、方法、属性的详细解释,注意使用英文关键字搜索。里面的一些 HTML,CSS,HTTP 技术教程也相当不错。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
HTML 和 CSS:
f248.png)
每个Web开发人员必备,很权威很齐全的Web开发文档。作为学习辞典使用,可以查询到每个概念、方法、属性的详细解释,注意使用英文关键字搜索。里面的一些 HTML,CSS,HTTP 技术教程也相当不错。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
HTML 和 CSS: