zoukankan      html  css  js  c++  java
  • js常见的排序算法

    最近面试可能会问这些

    1,插入排序

    function sort(elements){
      var res =[elements[0]];
      for (var i = 0; i < elements.length; i++) {
          one(res,elements[i]);
      };
      return res;
    }
    function one(arr,x){
      var len = arr.length;
      var temp = false;
      for (var i = 0; i < len; i++) { 
        if(arr[i]>=x){
          for (var j = len; j >i; j--) {
            arr[j]=arr[j-1];
          };
          arr[i]=x;
          temp = true;
          break;
        }
      }; 
      !temp&&arr.push(x);
      return arr;
    }

    简单来说就是插入一个数,在结果里找他插入的位置。位置怎么找呢,比如我要插入一个值,看一下哪个值比它大,那就插入到这个比他大的值的前面。遍历一下数组,往后诺位置。

    2.冒泡排序

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

    3.快速排序

    元素交换快排,但是用swap多声明了一个临时变量tmp。

     function quickSort(arr, left = 0, right = arr.length - 1) {
            if (left >= right) return;
            var i = left;
            var j = right;
            var privot = arr[left];
            while (i < j) {
                if (privot > arr[j]) {
                    swap(arr, j, i);
                    i++;
                } else {
                    j--;
                }
            }
            if (arr[i] > privot) {
                quickSort(arr, left, i-1);
                quickSort(arr, i, right);
            } else {
                quickSort(arr, left, i);
                quickSort(arr, i+1, right);
            }
            return arr;
        }
        function swap(arr, i, j) {
            var tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    
        var arr = [4, 13, 27, 38, 49, 49, 65, 55, 97, 76]
        console.log(quickSort(arr));

    下面这个是经典快拍,交换元素,空间复杂度最低。

    function quickSort(arr, left=0, right=arr.length) {
        if(left >= right) return;
        var i = left;
        var j = right - 1;
        var privot = arr[left];
        //console.log(privot);
        while(i < j) {
            while(i<j  && arr[j] >= privot) j--;
            arr[i] = arr[j];
            while(i<j && arr[i] <= privot) i++;
            arr[j]=arr[i];
        }
        arr[i]=privot;
        quickSort(arr, left, i);
        quickSort(arr, i+1, right);
       return arr; }
    const qsort = arr => arr.length <= 1? arr: 
            qsort(arr.filter(x => x < arr[0]))
            .concat(arr.filter(x => x == arr[0]))
            .concat(qsort(arr.filter(x => x > arr[0])))

    以下是阮一峰版,比较好理解,但是splice已是O(n)的复杂度

    var 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));
    };

     4希尔排序

     function shellSort(arr){
         var N=arr.length;
         var h=1;
         while(h<N/3){
          console.log(h);
             h=3*h+1;//设置间隔
         }
         while(h>=1){
             for(var i=h; i<N; i++){
                 for(j=i; j>=h && arr[j]<arr[j-h]; j-=h){
                     swap(arr, j, j-h);
                     console.log(arr);
                 }
             }
             h=(h-1)/3;
         }
     }
     function swap(array, i, j){//两个数调换
         var temp =array[j];
         array[j]=array[i];
         array[i]=temp;
     }

     5.归并排序

        function merge(left, right) {
     
       var re = [];
       while(left.length > 0 && right.length > 0) {
           if(left[0] < right[0]) {
               re.push(left.shift());
           } else {
               re.push(right.shift());
           }
       }
       /* 当左右数组长度不等.将比较完后剩下的数组项链接起来即可 */
     
       return re.concat(left).concat(right);
    }
     
    function mergeSort(array) {
      
       if(array.length == 1) return array;
       /* 首先将无序数组划分为两个数组 */
       var mid = Math.floor(array.length / 2);
       var left = array.slice(0, mid);
       var right = array.slice(mid);
       /* 递归分别对左右两部分数组进行排序合并 */
       return merge(mergeSort(left), mergeSort(right));
    }
    
     mergeSort(a);
  • 相关阅读:
    Verilog非阻塞赋值的仿真/综合问题 (Nonblocking Assignments in Verilog Synthesis)上
    异步FIFO结构及FPGA设计 跨时钟域设计
    FPGA管脚分配需要考虑的因素
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 上篇)
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 下篇)
    中国通信简史 (下)
    谈谈德国大学的电子专业
    中国通信简史 (上)
    Verilog学习笔记
    Verilog非阻塞赋值的仿真/综合问题(Nonblocking Assignments in Verilog Synthesis) 下
  • 原文地址:https://www.cnblogs.com/dh-dh/p/5891371.html
Copyright © 2011-2022 走看看