一些常见算法的JavaScript实现

算法小汇总
服务器君一共花费了163.447 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

在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;
}

本文地址:http://www.nowamagic.net/librarys/veda/detail/167,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/167

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《Python在Unix和Linux系统管理中的应用》 Noab Gift (作者), Jeremy M.Jones (作者)

《Python在Unix和Linux系统管理中的应用(影印版)》作者们还构建了一个可以免费下载的Ubuntu虚拟机。该虚拟机包含了这《Python在Unix和Linux系统管理中的应用(影印版)》的源代码,还可以用来运行书中的实例,包括SNMP、IPython、SQLAlchemy和许多其他工具。《Python在Unix和Linux系统管理中的应用》展示了Python语言如何提供一种更加高效的方式来处理Unix和Linux服务器管理工作中的各种任务。《Python在Unix和Linux系统管理中的应用(影印版)》的每一章都会提出一个特定的管理问题,例如并发或数据备份,然后通过实际的例子提供基于Python的解决方案。

更多计算机宝库...