• 一些常见算法的JavaScript实现


    在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;
    }
  • 相关阅读:
    解决端口被占用问题
    python实现操作mysql数据库
    python实现读取并处理excel单元格中的数据
    python实现读取配置文件
    python实现读取excel
    接口测试简介
    python实现获取文件夹中的最新文件
    Redis入门
    mysql高可用研究(二) 主从+MHA+Atlas
    mysql高可用研究(一) 主从+MHA架构
  • 原文地址:https://www.cnblogs.com/xiaoyang002/p/4109214.html
Copyright © 2020-2023  润新知