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,写的排序动画站,希望能够对数组排序的学习有所帮助๑乛◡乛๑

  • 相关阅读:
    Python基本数据统计(二)---- 数据选择 & 简单统计与处理
    python2.7无法使用上下左右和backspace
    Python基本数据统计(一)---- 便捷数据获取 & 数据准备和整理 & 数据显示
    CentOS 6.5下安装NumPy、SciPy、Scikit-Learn
    hihocoder 1296 数论三·约瑟夫问题
    The 13th Zhejiang Provincial Collegiate Programming Contest
    hihocoder1181 欧拉路
    UPCOJ2985 Gopher(二分匹配)
    HNU13377 Book Club(二分匹配)
    HDU4799 LIKE vs CANDLE(树形dp)
  • 原文地址:https://www.cnblogs.com/weven/p/7217988.html
Copyright © 2011-2022 走看看