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

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

  • 相关阅读:
    leetcode 309. Best Time to Buy and Sell Stock with Cooldown
    leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
    leetcode 32. Longest Valid Parentheses
    leetcode 224. Basic Calculator
    leetcode 540. Single Element in a Sorted Array
    leetcode 109. Convert Sorted List to Binary Search Tree
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 84. Largest Rectangle in Histogram
    leetcode 338. Counting Bits
    git教程之回到过去,版本对比
  • 原文地址:https://www.cnblogs.com/littlelittlecat/p/7596221.html
Copyright © 2011-2022 走看看