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,299評論 0 35
  • 總結一下常見的排序算法。 排序分內排序和外排序。內排序:指在排序期間數據對象全部存放在內存的排序。外排序:指在排序...
    jiangliang閱讀 1,375評論 0 1
  • 感冒了嗓子說不出話來了,屋外下著雨不停,心情很不好,在hn十年,bl20年,勤勤肯肯,一直在業務崗位,今天得知變化...
    Luuq閱讀 164評論 0 0
  • ca112cd4af4f閱讀 201評論 0 0