美文网首页Web 前端开发
Array.prototype.sort排序算法简单调研

Array.prototype.sort排序算法简单调研

作者: stois | 来源:发表于2016-09-08 11:17 被阅读89次

    首先回顾下用法

    arrayObject.sort(*sortby*)
    

    这里sortby是每次比较两个值时,所使用的比较函数。

    第一个问题:sort的背后使用了哪一套排序算法?

    Paste_Image.png

    携程设计委员会的文章的文章我们知道,在v8,Array.js中,
    <blockquote>
    代码中做过判断,数量小于或等于10的时候 走的是插入排序(InsertionSort);否则快速排序(QuickSort)
    对排序算法如果有了解的应该知道 InsertionSort是稳定的排序算法,QuickSort则是不稳定的算法。
    </blockquote>

    第二个问题,在哪里调用了sortby?
    如果上面的代码略抽象,我们不妨自己写个快排:

    //(1)在数据集之中,选择一个元素作为"基准"(pivot)。
    //(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
    //(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
    
    function sort6(array) {
        var tmp_array = array.slice(0),
            result, quickSort = function(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) { //sortby用在这里
                      left.push(arr[i]);    
                    } else {   
                       right.push(arr[i]);    
                    }  
                }  
                return quickSort(left).concat([pivot], quickSort(right));
            };
        result = quickSort(tmp_array);
        return result;
    }
    
    

    上面的代码出自排序图解:js排序算法实现

    第三个问题:我们知道了上面的东西,是不是可以骗骗人?

    答案是可以:

    var list = [1,2,3,4,5,6,7,8,9,0];
    console.log(
          list.sort(function() { 
             return Math.random() - 0.5 
          })
    );
    

    一种优雅的乱序。

    相关文章

      网友评论

        本文标题:Array.prototype.sort排序算法简单调研

        本文链接:https://www.haomeiwen.com/subject/giesettx.html