flag = true; //置标志位为1,证明发生了交换
}
}
if(!flag){ //未发生交换,则证明后续元素均有序排列
return arr;
}
}
return arr;
}
优化2:使用一个字段来记录最后一次交换的下标,比如[3,1,3,2,5,6,7],第一次排序后只需要记录pos = 2的位置,下次只比较从0 ~ 2的位置元素。
//优化冒泡2
function bubbleSort2(arr) {
var i = arr.length-1; //初始时,最后位置保持不变
while ( i> 0) {
var pos= 0; //每趟开始时,无记录交换
for (var j= 0; j< i; j++)
if (arr[j]> arr[j+1]) {
pos= j; //记录交换的位置
var tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;
}
i= pos; //为下一趟排序作准备,下一趟只需要比较0~pos的元素
}
return arr;
}
优化3:进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
//优化冒泡3
function bubbleSort3(arr3) {
var low = 0;
var high= arr.length-1; //设置变量的初始值
var tmp,j;
console.time(‘2.改进后冒泡排序耗时’);
while (low < high) {
for (j= low; j< high; ++j) //正向冒泡,找到最大者
if (arr[j]> arr[j+1]) {
tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;
}
–high; //修改high值, 前移一位
for (j=high; j>low; --j) //反向冒泡,找到最小者
if (arr[j]<arr[j-1]){
tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;
}
++low;
}
return arr;
}
适用场景
快排
思想及实现
-
选择一个元素作为“基准”
-
所有小于基准的元素都移到基准的左边,大于基准的元素移到基准的右边
-
对基准的左右俩个自己重复上述操作,知道剩余一个元素结束
//快速排序
function quickSort(arr){
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
//选出基准,并改变原数组去掉元素基准
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
//左边数组递归,右边数组递归,最后合并
return quickSort(left).concat([pivot], quickSort(right));
}
优化
优化主要是尽可能的选出好的“基准”,减少排序次数
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
id开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!