• js算法排序


    一、选择算法排序(算法时间复杂度为O(n²)级别)

        选择排序就是选择数组中的最小的树,依次排序。第一次选择最小的数放在第一位,第二次从剩余的元素中寻找最小的元素放在第二位,第三次在剩余的数中选择最小的数放在第三位,依次类推

    function getMInDate(arr){
    		var minIndex;
            var minValue;
    		for(var i=0;i<arr.length;i++){
    			minIndex=i;
                for(var j=i+1;j<arr.length;j++){
                    if(arr[j]<arr[minIndex]){
                      minIndex=j;
                    }
                }
                 minValue=arr[i];
                      arr[i]=arr[minIndex];
                      arr[minIndex]=minValue;
    		}
    		return arr;
    
    	}
    

      

    二、插入算法排序(算法时间复杂度为O(n²)级别)

      类似于打牌,选择合适的插入位置。第一个数位第一个元素,将第二个元素与前一个元素进行对比,如果小了,就交换位置。依次往前进行对比。将第三个元素与前一个元素进行对比,如果小于前一个元素,就与前一个元素进行交换,依次往前进行对比。依次类推。

    function insertDate(arr){
    		var _value;
           for(var i=1;i<arr.length;i++){
              for(var j=i;j>0;j--){
                  if(arr[j]<arr[j-1]){
                  	 _value=arr[j];
                  	 arr[j]=arr[j-1];
                  	 arr[j-1]=_value;
                  }
              }
           }
           return arr;
    	}  

    插入排序的优化:

    由于前后元素用赋值的方法进行替换,比较耗性能。可以将要对比的元素复制,依次与前面的元素进行对比,如果这个元素比前一个元素小,前一个元素就等于前前个元素,依次遍历,如果复制的元素比对比的元素要大,就将复制的元素赋值给对比的元素。依此类推。

    //插入排序的优化1 减少交换
    	function cloneDate(arr){
    		var e;
    		var _value;
    		var j;
           for(var i=1;i<arr.length;i++){
           	  e=arr[i];
           	  j=i;
              while(j>=1 && arr[j-1]>e){
              	arr[j]=arr[j-1];   
              	j--;       
              }
              arr[j]=e;
           }
           return arr;
    	}
    
    	//插入排序的优化2 减少交换
    	function cloneDate3(arr){
    		var e;
           for(var i=1;i<arr.length;i++){
           	  e=arr[i];     
              for(var j=i;j>0;j--){
                 if(arr[j-1]>e){ 	
                   arr[j]=arr[j-1];
                 }else{
                 	break;
                 }  
              } 
              arr[j]=e;   
           }
           return arr;
    	}
    

      

    三、归并算法排序(算法时间复杂度为O(nlogn)级别)

     自顶向下,使用递归。比较简洁

    1.先将C划分为两个数组A和B(即把数组C从中间分开)
    2.再分别对数组A、B重复步骤1的操作,逐步划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。
    如:              [12 20 30 21 15 33 26 19 40 25]
    划分为:  [12 20 30 21 15]                [33 26 19 40 25]
               [12 20]      [30 21 15]       [33 26]       [19 40 25]
             [12]  [20]   [30]  [21 15]     [33]  [26]    [19]    [40 25]
             [12]  [20]   [30] [21] [15]    [33]  [26]    [19]   [40] [25]
    3.然后从下层往上层不断合并数组,每一层合并相邻的两个子数组,合并的过程是每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,不断重复直到把两个子数组的元素都放到合并后的数组为止。

    4.依次类推,直到合并到最上层结束,这时数据的排序已经完成了。

    //归并算法
    	function mergeSort(arr){
          if(arr.length<2){
             return arr;
          }
          //设立一个中间值
          var middle=parseInt(arr.length/2);
          //第一个值与middle之间的左子列
          var left=arr.slice(0,middle)
          //第middle+1个值到最后的右子列
          var right=arr.slice(middle);
          if(left=="undefined" && right=="undefined"){
             return false;  
          }
          return merge(mergeSort(left),mergeSort(right));
    	}
    
    	function merge(left,right){ 
           var result=[];
           //左右子列有值
           while(left.length && right.length){
              if(left[0]<=right[0]){
                 result.push(left.shift())
              }else{
              	result.push(right.shift())
              }
           }
           //只有左子列有值
           while(left.length){  
    	     result.push(left.shift())  
           }
           //只有右子列有值
           while(right.length){
              result.push(right.shift())
           }
           return result;
    	}
    

      

    暂时写了三种,后续补充。

  • 相关阅读:
    ios input输入不了
    ios遇到的坑
    Linux搭建GitLab并汉化
    在Linux环境下tomcat 指定 jdk或jre版本
    SpringBoot设置默认首页
    解决MariaDB中文乱码
    使用Hexo+GitHub搭建免费个人博客
    Linux上安装node和npm
    Linux配置SSH Key到GitHub
    Linux安装Git
  • 原文地址:https://www.cnblogs.com/karila/p/8716723.html
Copyright © 2020-2023  润新知