JS算法
一、冒泡排序(Bubble Sort)
说明
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个
2、对每一个对相邻元素作同样的工作,从开始第一对到结尾最后一对。
3、针对所有元素重复以上的步骤,除了最后一个。
代码实现思路
1、比较轮次为 所有数字总数减一次(每轮次实现将最大数交换到最后即结束)
2、每轮比较次数依次递减(已确定为最大值者无需再比较)
3、效率优化如果某一轮比较结束没有进行交换,即证明冒泡顺序已经对位无需再执行下轮比较
function bubbleSort(ary){
//设置换位 标识
var flag = false;
//对比轮次 数组总数减1 for(var i = 0;i<ary.length-1;i++){
//每轮 对比次数减少1次 for(var j =0;j<ary.length-1-i;j++){
如果 前一位比后一位大就换位 if(ary[j]>ary[j+1]){ ary[j] = ary[j]+ary[j+1]; ary[j+1] = ary[j]-ary[j+1]; ary[j] = ary[j]-ary[j+1];
//如果有换位 做标记 flag = true; } }
//轮次结束 如果有换位 if(flag ){
//重置换位标识 flag = false;
//如果没有换位 说明 数组排序已完成 终止对比 }else{ break; } } return ary; } var ary = [10,9,2,4,3,2,11,22,33,12,15]; console.log(ary); var res = bubbleSort(ary); console.log(res);
二、快速排序
说明
将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 function quickSort(ary) { //如果数组长度小于1不进行排序直接返回该数组 if(ary.length<1){
function quickSort(ary) {
// 找到基准点的索引
if(ary.length<=1){
return ary ;
}
var pointIndex = Math.floor(ary.length/2);
// 通过基准点的索引在原来的数组中,删除这一项,并把基准点这一项的值获取到
var pointValue = ary.splice(pointIndex,1)[0];
var left=[];
var right=[];
for(var i=0;i<ary.length;i++) {
var cur = ary[i];
cur < pointValue ? left.push(cur) : right.push(cur);
}
//重新把 左中右 组合到一起
return quickSort(left).concat([pointValue],quickSort(right));
}
var ary = [12,13,23,14,20,26,34,13,16];
var res = quickSort(ary);
console.log(res);
三、插入排序
说明
讲一组数据 按顺序插入到一个新数组中 按照从大到小排序
<script type="text/javascript"> function insertSort(ary){ var newArray = []; newArray.push(ary[0]); for(var i = 1;i<ary.length;i++){ var cur = ary[i]; for(var j=newArray.length-1;j>=0 ;){ if(cur <newArray[j]){ j--; if(j === -1){ newArray.unshift(cur); } }else{ newArray.splice(j+1,0,cur); j=-1; } } } return newArray; } var ary =[1,2,3,5,23,34,54,65,34,12,11,15]; console.log(ary); var res = insertSort(ary); console.log(res); </script>
四、数组去重
function unique(ary){ var obj ={}; for(var i = 0;i<ary.length;i++){ var cur = ary[i]; if(obj[cur]==cur){ ary.splice(i,1,ary[ary.length-1]); ary.length--; i--; continue; } obj[cur]=cur; } return ary; } var ary =[1,1,1,2,3,3,3,3,4,4,4,5,6,6,7,7,7,7,]; console.log(ary); var res = unique(ary) console.log(res);
四.递归(100以内被3和5同时整除的数累加)
function rec(sum,num){ if(num <1){ return sum; } if(num%3==0&&num%5==0){ sum+=num; return rec(sum,num-1); }else{ return rec(sum,num-1); } } var res = rec(0,100); console.log(res);