zoukankan      html  css  js  c++  java
  • javascript数组(1) ——sort的工作原理及其他数组排序方法

    一说到数组排序,最直观的想法就是用sort啊!

    请问不用使用sort方法还可以使用什么方法进行数组排序?

    比如 :  快速排序法、合并排序法、冒泡排序法、选择排序法、插入排序法、布尔排序法、交互排序、选择排序、二分法排序.....

    等等一下,在我们了解这些排序方法之前,为了更好的理解,先让我们探索一下sort的工作原理

    //  sort()方法:按照字符编码的顺序进行排序
         var arr = [11,15,20,1000,25,2,40]
         arr.sort();          // [1000, 11, 15, 2, 20, 25, 40]
    
    //  sort()的两种使用方法:
    //  1.不带参数,比较字符串字母的排序
         var alpha =["I","L","O","V","E","W","E","B"]
         alpha.sort();      //["B", "E", "E", "I", "L", "O", "V", "W"]
     
    //  2.带参数,比较数字或大小
         var arr1 = [11,15,20,1000,25,2,40]
         function order (a,b){
               if(a>b){return 100;}   
               if(a<b){return -100;}  
               if(a==b){return 0;}   
         }
    //  此方法还可以简化
        function order (a,b){
               return a-b
         }
    //  a,b  分别取值进行比较,当a>b时为正数,当a<b时为负数,当a=b时为零。
         arr.sort(order);    //[2, 11, 15, 20, 25, 40, 1000]

     举了上面一系列的例子,相信大家对sort排序也有了初步的认知。那么,sort排序的工作原理是什么呢?

    工作原理:先比较第一个和第二个排序,再比较第三个,以此类推

    下面我们来说说其他排序方法,并且比较程序的运行速度

    快速排序法

    快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

    (1)在数据集之中,选择一个元素作为"基准"(pivot)。

    (2)所有小于"基准"的元素,都移到"基准"的前面;所有大于"基准"的元素,都移到"基准"的后面。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

    (3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    function quicksort(arr){
        if(arr.length == 0){return arr;}
        var pivot =arr[0];
        var left =new Array();
        var right = new Array();
        for (var i=1;i<arr.length;i++){
            if(arr[i]<pivot){
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return quicksort(left).concat(pivot,quicksort(right));
    
    }
    console.time('快速排序Tiem');
    console.log(quicksort(arr));
    console.timeEnd('快速排序Tiem');

    合并排序法

    如果列表的长度为0或1,那么它已被排序。除此以外:

    (1)将未排序的列表划分为大约一半大小的两个子列表。

    (2)通过重新应用合并排序来递归地排序每个子列表。

    (3)将两个子列表合并成一个排序列表。

    function mergeSort(arr){
        if (arr.length < 2)
            return arr;
        var middle = parseInt(arr.length / 2);
        var left   = arr.slice(0, middle);
        var right  = arr.slice(middle, arr.length);
        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;
    }
    console.time('合并排序Tiem');
    console.log(mergeSort(arr));
    console.timeEnd('合并排序Tiem');

    冒泡排序法

    具体算法描述如下:

    (1)比较相邻的元素。如果第一个比第二个大,就交换它们两个;

    (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

    (3)针对所有的元素重复以上的步骤,除了最后一个;

    (4)重复步骤 (1)(3)(1)(3),直到排序完成。

    function bubbleSort(arr) {
        var i = 0,
        len = arr.length,
        j, d;
        for (; i < len; i++) {
            for (j = 0; j < len; j++) {
                if (arr[i] < arr[j]) {
                    d = arr[j];
                    arr[j] = arr[i];
                    arr[i] = d;
                }
            }
        }
        return arr;
    }
    console.time('冒泡排序Tiem');
    console.log(bubbleSort(arr));
    console.timeEnd('冒泡排序Tiem');

     排序方法还有很多,在这里就不一一详解了,想了解更多可以查阅javascript排序算法汇总(写的很不错的哦~!)

    最后为大家推荐一个日本程序员norahiko,写的排序动画站,希望能够对数组排序的学习有所帮助๑乛◡乛๑

  • 相关阅读:
    Codeforces 1045C Hyperspace Highways (看题解) 圆方树
    Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
    Codeforces 803G Periodic RMQ Problem 线段树
    Codeforces 420D Cup Trick 平衡树
    Codeforces 295E Yaroslav and Points 线段树
    Codeforces 196E Opening Portals MST (看题解)
    Codeforces 653F Paper task SA
    Codeforces 542A Place Your Ad Here
    python基础 异常与返回
    mongodb 删除
  • 原文地址:https://www.cnblogs.com/weven/p/7217988.html
Copyright © 2011-2022 走看看