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

首先回顾下用法

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

一种优雅的乱序。

推荐阅读更多精彩内容