在Web开发中,JavaScript很重要,算法也很重要。下面整理了一下一些常见的算法在JavaScript下的实现,包括二分法、求字符串长度、数组去重、插入排序、选择排序、希尔排序、快速排序、冒泡法等等。仅仅是为了练手,不保证高效与美观,或许还有Bug,有时间再完善吧。
二分法:
function binary(items,value){ var startIndex=0, stopIndex=items.length-1, midlleIndex=(startIndex+stopIndex)>>>1; while(items[middleIndex]!=value && startIndex<stopIndex){ if(items[middleIndex]>value){ stopIndex=middleIndex-1; }else{ startIndex=middleIndex+1; } middleIndex=(startIndex+stopIndex)>>>1; } return items[middleIndex]!=value ? false:true; }
十六进制颜色值的随机生成:
function randomColor(){ var arrHex=["0","2","3","4","5","6","7","8","9","a","b","c","d"], strHex="#", index; for(var i=0;i < 6; i++){ index=Math.round(Math.random()*15); strHex+=arrHex[index]; } return strHex; }
一个求字符串长度的方法:
function GetBytes(str){ var len=str.length, bytes=len; for(var i=0;i < len;i++){ if(str.CharCodeAt>255){ bytes++; } } return bytes; }
js实现数组去重:
Array.protype.delRepeat=function(){ var newArray=new Array(); var len=this.length; for(var i=0;i < len;i++){ for(var j=i+1;j < len;j++) { if(this[i]==this[j]) { ++i; } } newArray.push(this[i]); } return newArray; }
插入排序。所谓的插入排序,就是将序列中的第一个元素看成一个有序的子序列,然后不段向后比较交换比较交换。
function insertSort(arr){ var key; for(var j = 1; j < arr.length ; j++){ //排好序的 var i = j - 1; key = arr[j]; while(i >= 0 && arr[i] > key){ arr[i + 1] = arr[i]; i --; } arr[i + 1] = key; } return arr; }
选择排序。其实基本的思想就是从待排序的数组中选择最小或者最大的,放在起始位置,然后从剩下的数组中选择最小或者最大的排在这公司数的后面。
function selectionSort(data) { var i, j, min, temp , count=data.length; for(i = 0; i < count - 1; i++) { /* find the minimum */ min = i; for (j = i+1; j < count; j++) { if (data[j] < data[min]) { min = j;} } /* swap data[i] and data[min] */ temp = data[i]; data[i] = data[min]; data[min] = temp; } return data; }
希尔排序,也称递减增量排序算法。其实说到底也是插入排序的变种。
function shellSort(array){ var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse()在维基上看到这个最优的步长较小数组 var i = 0; var stepArrLength = stepArr.length; var len = array.length; var len2 = parseInt(len/2); for(;i < stepArrLength; i++){ if(stepArr[i] > len2){ continue; } stepSort(stepArr[i]); } // 排序一个步长 function stepSort(step){ //console.log(step) 使用的步长统计 var i = 0, j = 0, f, tem, key; var stepLen = len%step > 0 ? parseInt(len/step) + 1 : len/step; for(;i < step; i++){// 依次循环列 for(j=1;/*j < stepLen && */step * j + i < len; j++){//依次循环每列的每行 tem = f = step * j + i; key = array[f]; while((tem-=step) >= 0){// 依次向上查找 if(array[tem] > key){ array[tem+step] = array[tem]; }else{ break; } } array[tem + step ] = key; } } } return array; }
快速排序。其实说到底快速排序算法就系对冒泡排序的一种改进,采用的就是算法理论中的分治递归的思想,说得明白点,它的做法就是:通过一趟排序将待排序的纪录分割成两部分,其中一部分的纪录值比另外一部分的纪录值要小,就可以继续分别对这两部分纪录进行排序;不段的递归实施上面两个操作,从而实现纪录值的排序。
function quickSort(arr,l,r){ if(l < r){ var mid=arr[parseInt((l+r)/2)],i=l-1,j=r+1; while(true){ while(arr[++i] < mid); while(arr[--j]>mid); if(i>=j)break; var temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } quickSort(arr,l,i-1); quickSort(arr,j+1,r); } return arr; }
冒泡法:
function bullSort(array){ var temp; for(var i=0;i < array.length;i++) { for(var j=array.length-1;j > i;j--){ if(array[j] < array[j-1]) { temp = array[j]; array[j]=array[j-1]; array[j-1]=temp; } } } return array; }