js 之sort排序原理詳解

看到sort大家應該很熟悉不過了,還是簡單說下它的用法,然後再來一步步來模擬下實現它的原理吧!

1.sort用法

首先sort是數組的一個方法,sort() 方法用於對數組的元素進行排序!然後返回排序後的數組。默認排序順序是升序,建立在將元素轉換爲字符串,然後比較其UTF-16代碼單元值的序列的基礎上,請注意,該數組按位置排序,並且不進行任何複製!

一.默認無參數情況
var arr=[0,11,1,22,3,44,5]
console.log(arr.sort())//[0, 1, 11, 22, 3, 44, 5]

數組會按照字符的Unicode進行排序(把數組裏面當成字符串處理)。

二.參數爲對比函數情況

如果想按照其他標準進行排序,就需要提供比較函數,該函數要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下:

若 a 小於 b,在排序後的數組中 a 應該出現在 b 之前,則返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。

上面的描述我是從w3c上覆制過來,其實說的不是很明白,很多人看的是懵的,其實你可以這樣理解,傳入的函數給定一對特定的元素a ,b 作爲其兩個參數,函數返回值大於0就是升序排列,如果是小於0就是降序!等於0就順序不變,

var asc = (a,b)=>a-b;  //升序
var des= (a,b)=>b-a; //降序
//或者
var asc = (a, b) => a - b < 0 ? -1 : 1 //升序
var des = (a, b) => a - b < 0 ? 1 : -1 //降低序

我們先來看個例子

var asc = (a, b) => a - b < 0 ? -1 : 1 //升序
var des = (a, b) => a - b < 0 ? 1 : -1 //降低序
var arr = [10, 44, 5, 78, 1, 99];
var arr1 = [10, 44, 5, 78, 1, 99];
console.log(arr.sort(asc));// [1, 5, 10, 44, 78, 99]
console.log(arr1.sort(des))// [99, 78, 44, 10, 5, 1]
二.模擬sort的實現

首先應該注意幾點
1.傳入的函數必須要是函數
2.如果沒傳參數的話,那麼就是默認升序排序方式
3.當傳入的函數返回值大於0就升序排列,小於0是降序排列
根據上面幾點我們自己手動模擬下

Array.prototype.sortTest = function () {
let fn = arguments ? typeof arguments[0] === "function" && arguments[0]: (x, y) => x - y;
for (var i = 0; i < this.length; i++) {
    for (var j = i + 1; j < this.length; j++) {
        if (fn(this[i], this[j]) > 0) {
            p = this[i];
            this[i] = this[j];
            this[j] = p;
        };
    };
};
return this;
}
var add = (x, y) => x - y;
var des = (x, y) => y - x;
var arr = [10, 44, 5, 78, 1, 99];
var arr1 = [10, 44, 5, 78, 1, 99];
var arr2 = [10, 44, 5, 78, 1, 99];
var arr3 = [10, 44, 5, 78, 1, 99];
console.log(arr.sortTest(add));//[1, 5, 10, 44, 78, 99]
console.log(arr1.sort(add));//[1, 5, 10, 44, 78, 99]
console.log(arr2.sortTest(des));//[99, 78, 44, 10, 5, 1]
console.log(arr3.sort(des));//[99, 78, 44, 10, 5, 1]

上面是簡單的模擬下sort實現的原理!其實底層實現沒有這麼的簡單!只是用最簡單的方式來實現出來的,方便大家對sort的更深刻理解!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章