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

首先回顧下用法

arrayObject.sort(*sortby*)

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

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

Paste_Image.png

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

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

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

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

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

答案是可以:

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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容