Array.sort()的底层实现

390 阅读1分钟

在V8引擎中,sort函数只给出了两种排序insertSort和quickSort,数组长度小于等于22的用insertSort大于22的用quickSort

手写快速排序

时间复杂度 (nlogn)

1.递归新建数组版本

      function quickSort(arr){
       if(arr.length<=1)  return arr;
       let left=[];
       let right=[];
      let middle=Math.floor(arr.length/2);
      var pivot=arr[middle];
      for(var i=0,l=arr.length;i<l;i++){
           if(i===middle) continue;
           if(arr[i]<pivot){
               left.push(arr[i])
           }else{
               right.push(arr[i])
           }
       }
       return quickSort(left).concat(pivot,quickSort(right));
    }
    var arr=[9,2,11,4,23,8,67];
   console.log( quickSort(arr));

2.标准版本

   function quickSort(arr,left,right){
    var i=left=left?left:0;
    var j=right=right?right:arr.length-1;
    var middle=Math.floor((i+j)/2)
    var pivot=arr[middle];
    var tmp;
    while(i<=j){
        while(arr[j]>pivot) {j--};
        while(arr[i]<pivot) {i++};
        if(i<=j){
            tmp=arr[i];
            arr[i]=arr[j];
            arr[j]=tmp;
            i++;
            j--;
        }
        if(left<j){
            quickSort(arr,left,j);
        }
        if(right>i){
            quickSort(arr,i,right);
        }
    }
    return arr;
}
var arr=[1,0,21,4,23,8,1];
  console.log( quickSort(arr));

手写插入排序

     function insertSort(arr){
      var length=arr.length;
      for(var i=1;i<length;i++){
          var temp=arr[i];
          var j=i;
          while(arr[j-1]>temp&&j>0){
              arr[j]=arr[j-1];
              j--;
          }
          arr[j]=temp;
      }
      return arr;
  }
  var arr=[1,0,21,4,23,8,1];
  console.log( insertSort(arr));