zoukankan      html  css  js  c++  java
  • javaScript排序,别再说你只会冒泡!!!

    虽然说是做前端,但有时还是会用到排序算法,大一c语言就会冒泡法,现在学了javaScript就别再说只会冒泡了,很有必要在学习其他的排序方法了。

    冒泡排序

    具体原理就不在赘述了,直接上代码:

    function bubbleSort(arr){
        var len=arr.length;
        for(var i =0;i<len-1;i++){
            for(var j=0;j<len-1-i;j++){
                if(arr[j]>arr[j+1]){      //相邻元素两两比;
                    var temp=arr[j+1];    //交换相邻元素;
                    arr[j+1]=arr[j];
                    arr[j]=temp;
    
                }
            }
        }
    }
    return arr;

    选择排序

    原理非常的简单,每次都找一个最大或最小的排在开始即可。

    首先在未排序列中找到最小(大)元素,存放到排序序列的起始位置

    再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序列的末尾。

    重复第二步,直到所有元素排序完成。

    function selectionSort(arr) {
        var len = arr.length;
        var minIndex, temp;
        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;
        }
        return arr;
    }

    插入排序

    插入排序也比较简单。就像打扑克一样,依次将拿到的元素插入到正确的位置即可。

    1.将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 
    2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。

    function insertionSort(arr) {
        var len = arr.length;
        var preIndex, current;
        for (var i = 1; i < len; i++) {
            preIndex = i - 1;
            current = arr[i];
            while(preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex+1] = arr[preIndex];
                preIndex--;
            }
            arr[preIndex+1] = current;
        }
        return arr;
    }

    上面三种都是非常简单的排序方法,简单的同时呢,效率也会比较低,还是拿这本书里的对比图来说明:

    时间复杂度都高达O(n^2),而它们后面的一些排序算法时间复杂度基本都只有O(n log n)。

    我想要高效率一点的排序方法。

    归并排序

    基本原理是分治法,就是分开并且递归来排序。

    步骤如下:

    1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列; 
    2.设定两个指针,最初位置分别为两个已经排序序列的起始位置; 
    3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置; 
    4.重复步骤 3 直到某一指针达到序列尾; 
    5.将另一序列剩下的所有元素直接复制到合并序列尾。

    function mergeSort(arr) {  // 采用自上而下的递归方法
        var len = arr.length;
        if(len < 2) {
            return arr;
        }
        var middle = Math.floor(len / 2),
            left = arr.slice(0, middle),
            right = arr.slice(middle);
        return merge(mergeSort(left), mergeSort(right));
    }
     
    function merge(left, right)
    {
        var result = [];
     
        while (left.length && right.length) {
            if (left[0] <= right[0]) {
                result.push(left.shift());
            } else {
                result.push(right.shift());
            }
        }
     
        while (left.length)
            result.push(left.shift());
     
        while (right.length)
            result.push(right.shift());
     
        return result;
    }

     想别失业,就多学几种排序方法吧!!!!

  • 相关阅读:
    【模板】多项式开根(加强版)
    【模板】多项式幂函数 (加强版)
    Codeforces Round #628 (Div. 2) 总结
    [TJOI2017] 不勤劳的图书管理员
    [HNOI2015] 接水果
    [USACO3.4] Raucous Rockers
    [CF1268B] Domino for Young
    Linux提权小结
    weblogic漏洞练习
    SSL/TLS 安全测试
  • 原文地址:https://www.cnblogs.com/littlelittlecat/p/7596221.html
Copyright © 2011-2022 走看看