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

一种优雅的乱序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 版本记录 前言 将数据结构和算法比作计算机的基石毫不为过,追求程序的高效是每一个软件工程师的梦想。下面就是我对算法...
    刀客传奇阅读 5,193评论 4 72
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,292评论 0 35
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,375评论 0 1
  • 感冒了嗓子说不出话来了,屋外下着雨不停,心情很不好,在hn十年,bl20年,勤勤肯肯,一直在业务岗位,今天得知变化...
    Luuq阅读 164评论 0 0
  • ca112cd4af4f阅读 200评论 0 0