zoukankan      html  css  js  c++  java
  • js 排序算法总结

    1.冒泡排序 

    平均时间复杂度O(N2) 最好情况O(N)最坏情况O(N2) 空间复杂度O(1)

    function bubbleSort(arr){
        if(arr.length <= 1)
            return arr;
        var flag = 1;             // 标识是否进行交换
        for(var i=0; i < arr.length; i++){
            if(i !=0 && flag) break;
            for(var j=0; j < arr.length-i-1; j++){
                if(arr[j] > arr[j+1]){
                    if(flag == 1) flag = 0;
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }    
        }
        return arr;
    }
    var a = [2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];
    console.log(bubbleSort(a));

    升级版冒泡排序

    function bubbleSort2(arr) {
      var low = 0;
      var high= arr.length-1; //设置变量的初始值
      var tmp,j;
      console.time('2.改进后冒泡排序耗时');
      while (low < high) {
        for (j= low; j< high; ++j) {         //正向冒泡,找到最大者
          if (arr[j]> arr[j+1]) {
            tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;
          }
        }
        --high;  //修改high值, 前移一位
        for (j=high; j>low; --j) {          //反向冒泡,找到最小者
          if (arr[j]<arr[j-1]) {
            tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;
          }
        } 
        ++low;  //修改low值,后移一位
      }
      console.timeEnd('2.改进后冒泡排序耗时');
      return arr;
    }
    var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
    console.log(bubbleSort2(arr));

    2.选择排序

    平均时间复杂度O(N2) 最好情况O(N2)最坏情况O(N2) 空间复杂度O(1)  适合小数据(1000以内)排序

    function selectionSort(arr) {
      var len = arr.length;
      var minIndex, temp;
      console.time('选择排序耗时');
      for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
          if (arr[j] < arr[minIndex]) { //寻找最小的数
            minIndex = j; //将最小数的索引保存
          }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
      }
      console.timeEnd('选择排序耗时');
      return arr;
    }
    var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
    console.log(selectionSort(arr));

    3. 插入排序

    平均时间复杂度O(N2) 最好情况O(N)最坏情况O(N2) 空间复杂度O(1)

    function insertionSort(array) {
      console.time('插入排序耗时:');
      for (var i = 1; i < array.length; i++) {
        var key = array[i];
        var j = i - 1;
        while ( array[j] > key) {
          array[j + 1] = array[j];
             j--;
        }
        array[j + 1] = key;
      }
      console.timeEnd('插入排序耗时:');
      return array;
    }
    var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
    console.log(insertionSort(arr));

    升级版(通过二分法查找左边有序数组中待差数字的插入位置)

    function binaryInsertionSort(array) {
      console.time('二分插入排序耗时:');
      for (var i = 1; i < array.length; i++) {
        var key = array[i], left = 0, right = i - 1;
        while (left <= right) {
          var middle = parseInt((left + right) / 2);
          if (key < array[middle]) {
            right = middle - 1;
          } else {
            left = middle + 1;
          }
        }
        for (var j = i - 1; j >= left; j--) {
          array[j + 1] = array[j];
        }
        array[left] = key;
      }
      console.timeEnd('二分插入排序耗时:');
      return array;
    }
    var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
    console.log(binaryInsertionSort(arr));

    4. 快速排序

    平均时间复杂度O(NlogN) 最好情况O(NlogN)最坏情况O(N2) 空间复杂度O(logN)

    function quickSort(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));
    }
    var arr=[2,3,1];
    console.log(quickSort(arr));
  • 相关阅读:
    Gengxin讲STL系列——Set
    理解Python的With语句
    Python中Non-ASCII character 'xe7' in file的问题解决
    gnome-terminal的一些调整
    硬盘的CHS寻址
    Wiz发布cnblog笔记
    cygwin安装man手册
    linux命令行使用
    小步前进
    学习的感觉真好
  • 原文地址:https://www.cnblogs.com/fjl-vxee/p/8549358.html
Copyright © 2011-2022 走看看