• 排序小结


     

    两路快排:

    function partion(arr, low, high){
       var idx = low;
       var pivot = arr[low];
       while(low<high){
          while(low<high && arr[high]>= pivot){ high--; }
          while(low<high && arr[low] <= pivot) { low++; }
          if(low<high){
             var temp = arr[high];
             arr[high] = arr[low];
             arr[low] = temp;
          }
       }
       if(low == high){
         arr[idx] = arr[low];
         arr[low] = pivot;
       }
       return low;
    }
    
    function quicksort1(arr, low, high){
      if(low < high ){
         var pivot = partion(arr, low, high);
         quicksort(arr, low, pivot-1);
         quicksort(arr, pivot+1, high);
      }
    }
    
    function quicksort2(arr, low, high){
       var stack = [];
       if(low<high){
         var mid = partion(arr, low, high);
         if(low< mid -1){
           stack.push(low);
           stack.push(mid-1);
         }
         if(mid+1< high){
           stack.push(mid+1);
           stack.push(high);
         }
       }
    
        while(stack.length > 0){
          var higher = stack.pop();
          var lower = stack.pop();
          var midder = partion(arr, lower, higher);
          if(lower < midder -1){
             stack.push(lower);
             stack.push(midder -1);
          }
          if(midder+1 < higher){
             stack.push(midder + 1);
             stack.push(higher);
          }
        }
    
    }
    
    var arr = [3,6,2,9,4,7];
    quicksort1(arr, 0, arr.length -1);
    quicksort2(arr, 0, arr.length -1);

    冒泡排序:优化后的

    function Bubblesort(arr){
      var len = arr.length;
      for(var i=0;i< len-1; i++){ //代表要排序多少次
        for(var j=0;j< len-i-1;j++){ //每次的起始和截止位置
          if(arr[j] > arr[j+1]){
             var tem = arr[j];
             arr[j] = arr[j+1];
             arr[j+1] = tem;
          }  
        }
      }
    }

    选择排序:

    function Selection(arr){
       for(var i=0;i< arr.length-1; i++){ //代表要排序多少次
         for(var j=i+1; j<arr.length; j++){ //起始和截止位置
            if(arr[i] > arr[j]){
               var temp = arr[i];
               arr[i] = arr[j];
               arr[j] = temp;
            }
         }
       }
    }

    插入排序:一般的插入排序

    对于每个未排序数,在已排序序列中从后向前扫描找到相应位置并插入。默认arr[0]为开始。

    function InsertSort(arr){
       for(var i=1;i< arr.length;i++){ //需要对arr.length-1个数进行排序,级进行这么多次
         var item = arr[i]; //记录待排序数数值和下标
         var pos = i;
         while(i>0 && item< arr[i-1]){ //找应该插在哪个位置
            i--;
         }
         //位置已确定,即从i位置往后移动
         for(var k=pos; k>i; k--){
           arr[k] = arr[k-1];
         }
         arr[k] = item;
       }
    }

    存在缺陷:我在查找应该插入哪个位置的时候只是单纯的去找位置,找到后才移动,可以更为优化,即在查找的时候若不是就移动一个

    function InsertSort(arr){
       for(var i=1;i< arr.length;i++){
         var item = arr[i];
         var pos = i;
         while(i>0 && item< arr[i-1]){
            arr[i] = arr[i-1];
            i--;
         }
         arr[i] = item;
       }
    }

    希尔排序:分组插入排序(高级插入排序)

    第一次排序:将数组按增量划分为多个列,装在一个表中,对列分别进行插入排序,之后再合并为一个数组
    第二次排序:将数组按另一个增量划分多个列,同上

    function shellSort(arr){
    var gap = Math.floor(arr.length/2); 
    while(gap>0){
      for(var i=gap; i<arr.length; i++){
         var temp = arr[i];
         while(i>=gap && temp < arr[i-gap]){
           arr[i] = arr[i-gap];
           i -= gap;
         }
         arr[i] = temp;
      }
      gap = Math.floor(gap/2);
      console.log(gap)
     }
    }

     归并排序:

    有点问题:

    function dev(arr){
      if(arr.length <=1) return arr;
      var mid = Math.floor(arr.length/2);
      var leftarr = dev(arr.slice(0, mid));
      var rightarr = dev(arr.slice(mid));
      return merge(leftarr, rightarr);
    }
    
    function merge(leftarr, rightarr){ 
      var l,r = 0;
      var result = [];
      while(l<leftarr.length && r< rightarr.length){
        if(leftarr[l] < rightarr[r]){
          result.push(leftarr[l]);
          l++
        }else{
          result.push(rightarr[r]);
          r++;
        }
      }
      for(var i=l; i< leftarr.length; i++){
         result.push(leftarr[i]);
      }
      for(var i=r; i< rightarr.length; i++){
         result.push(rightarr[i]);
      }
      return result;
    }

    二分排序:

    function binarySearch(value,arr,startIndex,endIndex) {
        if(!value|| !(arr instanceof Array)) return;
        var    midIndex= Math.floor((startIndex + endIndex)/2),
            midval = arr[midIndex];
        
        if(midval === value){
            return midIndex;
        }else if (midval > value) {
           return binarySearch(value, arr, startIndex, midIndex - 1);
        }else {
           return binarySearch(value, arr, midIndex + 1, endIndex);
        }
    }
  • 相关阅读:
    音频可视化
    accunulate
    node
    js 中编码(encode)和解码(decode)的三种方法
    ES6高阶 同步和异步 回调地狱 promise async和await
    区间dp
    树形dp1
    背包dp(多重)
    树形dp
    背包dp(完全)
  • 原文地址:https://www.cnblogs.com/venoral/p/5836106.html
Copyright © 2020-2023  润新知