Array.prototype.sort排序算法簡單調(diào)研

首先回顧下用法

arrayObject.sort(*sortby*)

這里sortby是每次比較兩個值時,所使用的比較函數(shù)。

第一個問題:sort的背后使用了哪一套排序算法?

Paste_Image.png

攜程設(shè)計委員會的文章的文章我們知道,在v8,Array.js中,
<blockquote>
代碼中做過判斷,數(shù)量小于或等于10的時候 走的是插入排序(InsertionSort);否則快速排序(QuickSort)
對排序算法如果有了解的應(yīng)該知道 InsertionSort是穩(wěn)定的排序算法,QuickSort則是不穩(wěn)定的算法。
</blockquote>

第二個問題,在哪里調(diào)用了sortby?
如果上面的代碼略抽象,我們不妨自己寫個快排:

//(1)在數(shù)據(jù)集之中,選擇一個元素作為"基準"(pivot)。
//(2)所有小于"基準"的元素,都移到"基準"的左邊;所有大于"基準"的元素,都移到"基準"的右邊。
//(3)對"基準"左邊和右邊的兩個子集,不斷重復(fù)第一步和第二步,直到所有子集只剩下一個元素為止。

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排序算法實現(xiàn)

第三個問題:我們知道了上面的東西,是不是可以騙騙人?

答案是可以:

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

一種優(yōu)雅的亂序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 版本記錄 前言 將數(shù)據(jù)結(jié)構(gòu)和算法比作計算機的基石毫不為過,追求程序的高效是每一個軟件工程師的夢想。下面就是我對算法...
    刀客傳奇閱讀 5,193評論 4 72
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,292評論 0 35
  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,375評論 0 1
  • 感冒了嗓子說不出話來了,屋外下著雨不停,心情很不好,在hn十年,bl20年,勤勤肯肯,一直在業(yè)務(wù)崗位,今天得知變化...
    Luuq閱讀 164評論 0 0
  • ca112cd4af4f閱讀 198評論 0 0