数组排序相关

Posted 一线蓝光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组排序相关相关的知识,希望对你有一定的参考价值。

1.sort 方法

sort()对数组排序,不开辟新的内存,对原有数组进行调换,即影响原数组。

1.1简单排序

<script>
   var arr=new Array(1,5,4,3);
   arr.sort();
   console.log(arr.join); //[1,3,4,5];
</script>

问题: 由简单数字组成的数组不可以用这种方法排序

例如:var arr=[12,3,44,5];

        console.log(arr.sort());

       结果是: [12,3,44,5];

  因为js默认比较函数是把要排序的元素都视为字符串,不能在比较这些元素之前先检测他们的类型,所以按字符串排序。

1.2自定义排序

<script>
   var arr=new Array(1,5,4,3);
   arr.sort(function(a,b){
     return b-a;
  });
   console.log(arr); 
</script>

a,b表示数组中的任意两个元素,如果返回值大于0,b在前,a在后,按从大到小排序。

 返回值小于0,b在后,a在前,按从小到大排序。

 return a-b 按从小到大排序,b-a按从大到小排序。

参考文章:http://www.cnblogs.com/longze/archive/2012/11/27/2791230.html

 

2.冒泡排序

 

 function bubbleSort(array){

    var i=0,len=array.length,j,d;

    for(;i<len;i++){

     for(var j=0;j<len;j++){

        if(array[i]<array[j]){

        d=array[i];array[j]=array[i];array[i]=d;

        }

     }

   }

  return array;

}

3.插入排序  从下标1开始 每增1项排序依次,越往后遍历次数越多

var arr=[1,6,4,3,8];
  function sort1(array){
    var len=array.length,i,j,tmp,result;
    //设置数组副本
   result=array.slice(0);
   for(var i=1;i<len;i++){
      tmp=array[i];
      j=i-1;
      while(j>=0 && tmp<result[j]){
         result[j+1]=result[j];
        j--;
      }
     result[j+1]=tmp;
  }
  return result;
   
 }

4.二分法插入排序

//现在有序区通过二分查找的方法找到移动元素的起始位置,然后通过这个起始位置将后面的所有元素后移。

function sort2(array){
   var len=array.length,i,j,tmp,low,high,mid,result;
    result=array.slice(0);
     for(var i=0;i<len;i++){
      tmp=result[i];
      low=0;
      high=i-1;
      while(low<=high){
        mid=parseInt((low+high)/2,10);
        if(tmp<result[mid])high=mid-1;
        else low=mid+1;
       }
     for(var j=i-1;j>high+1;j--){
          result[j+1]=result[j];
       }
     result[j+1]=tmp;
    }

   return result;

}

还有很多,今天先学习到这里。原文请戳这里:http://www.jianshu.com/p/7e6589306a27

 

 

// 2017-5-27

今天继续学习哈。。。

5.冒泡排序

排序思路:遍历数组,每次遍历就将最大(或最小)值推至最前,越往后遍历查询次数越小,跟插入排序刚好相反。

//冒泡排序,每次将最小元素推至最前
function sort4(array){
   var len=array.length,i,j,tmp,result;
   result=array.slice(0);
   for(var i=0;i<len;i++){
      for(var j=len-1;j>i;j--){
        if(result[j]<result[j-1]){
           tmp=result[j-1];
            result[j-1]=result[j];
            result[j]=tmp;
         }
       }
   }
return result;
 
}

5.冒泡排序改进

当一次遍历前后数组不产生变化时,说明该数组已经有序,结束排序。

//如果在某次的排序中没有出现交换的情况
//那么说明在无序的元素已经有序了,可以直接返回。
function sort5(array){
   var len=array.length,i,j,tmp,exchange,result;
   result=array.slice(0);
   for(i=0;i<len;i++){
      exhange=0;
     for(j=len-1;j>i;j--){
          if(result[j]<result[j-1]){
            tmp=result[j];
          result[j]=result[j-1];
          result[j-1]=tmp;
          exchange=1;
         }
      }
    if(!exchange)return result;
  }
return result;
}

6.快速排序

   6.1 在数据集之后,选择一个元素作为“基准”(pivot);

   6.2 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

  6.3对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

function sort6(array){
   var tmp_array=array.slice(0),result,
   quickSort=function(arr){
     if(arr.length<=1){return arr;}
      var pivotIndex=Math.floor(arr.length/2);
      var pivot=arr.splice(pivotIndex,1)[0];
      var left=[];
      var right=[];
     for(var i=0;i<arr.length;i++){
        if(arr[i]<pivot){
           left.push(arr[i]);
         }else {
           right.push(arr[i]);
         }
      }
    return quickSort(left).concat([pivot],quickSort(right));
   };
    result=quickSort(tmp_array);
    return result;
}

 

以上是关于数组排序相关的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的时间复杂度是多少?

几个关于js数组方法reduce的经典片段

几个关于js数组方法reduce的经典片段

快速排序-递归实现

对数组中的字符串进行排序,使其稀疏

算法排序之堆排序