數組sort方法源碼解析


我們提到數組排序都會想到數組的sort方法,這個方法用起來的確很方便,其原理還是用到了我們的冒泡排序,sort函數接受一個參數,參數為一個函數,如果不指定參數,則按照則按unicode碼順序排列。

var arr=[7,3,6,1,5,12];
console.log(arr.sort());//[1, 12, 3, 5, 6, 7]
console.log(arr.sort(function(a,b){
     return a-b;
})); //[1, 3, 5, 6, 7, 12]

其實源碼實現也不是很難,首先我們要知道的這是數組上的一個方法,肯定是寫在數組構造函數的原型上,這樣所有的數組實例才能共享這個方法,首先傳入一個函數,根據函數的返回值來確定數組的順序。話不多說,直接上代碼

  Array.prototype.customeSort = function (func) {
                var array = this;//保存this對象,這個指的是調用sort方法的數組對象
                for (var i = 0; i < array.length - 1; i++) {
                    for (j = 0; j < array.length - i - 1; j++) { //需要走雙層循環,一層循環只能確保最后一個元素是最大或者是最小,需要依次往前遍歷
                        var val = func(array[j], array[j + 1]);
                        if (val > 0) {//通過函數返回值交換兩個數組元素
                            array[j] = array[j] + array[j + 1];
                            array[j + 1] = array[j] - array[j + 1];
                            array[j] = array[j] - array[j + 1];
                        }
                    }
                }
                return array;
            }

這個時候一個簡單的sort方法已經基本上實現了,但是我們前面說過了,sort也有不傳入參數的情況,因為我們無法控制別人如何調用,這個時候func就報錯了 。

             

因為找不到這個函數,我們就需要判斷做一下處理,

  Array.prototype.customeSort = function (func) {
                var array = this;
                if (func == undefined) {如果什么都傳,就比較他們的unicode碼
                    for (var i = 0; i < array.length - 1; i++) {
                        for (j = 0; j < array.length - i - 1; j++) {
                            var temp;//定義一個變量,用來暫時儲蓄臨時變量,給他們交換
                            if (String(array[j])>String(array[j + 1])) {
                                 temp= array[j + 1];
                                 array[j+1]=array[j];
                                 array[j]=temp;
                            }
                        }
                    }
                }
                else if(typeof func=="function") {//如果傳入函數,就執行下面的代碼
                    for (var i = 0; i < array.length - 1; i++) {
                        for (j = 0; j < array.length - i - 1; j++) {
                            var val = func(array[j], array[j + 1]);
                            if (val > 0) {
                                array[j] = array[j] + array[j + 1];
                                array[j + 1] = array[j] - array[j + 1];
                                array[j] = array[j] - array[j + 1];
                            }
                        }
                    }
                }
                return array;
            }

現在一個完整的sort方法就基本上實現了,不足之處請大家指正。

無意中輸出了arr,發現arr也改變了,突然想到了數組是引用類型,我在內部保存了也沒啥卵用,他保存的是地址,所有一開始我們需要把傳進來的數組復制出來。這個時候就需要用到es6,不得不說es6真的很好用,現在很多招聘都直接要求熟悉es6了。

上最后的代碼     

   Array.prototype.customeSort = function (func) {
                var array = [...this];//復制出調用的arr對象,這樣后面我們修改的就是array對象,改變不了原數組
                if (func == undefined) {
                    for (var i = 0; i < array.length - 1; i++) {
                        for (j = 0; j < array.length - i - 1; j++) {
                            var temp="";
                            if (String(array[j])>String(array[j + 1])) {
                                 temp= array[j + 1];
                                 array[j+1]=array[j];
                                 array[j]=temp;
                            }
                        }
                    }
                }
                else if(typeof func=="function") {
                    for (var i = 0; i < array.length - 1; i++) {
                        for (j = 0; j < array.length - i - 1; j++) {
                            var val = func(array[j], array[j + 1]);
                            if (val > 0) {
                                array[j] = array[j] + array[j + 1];
                                array[j + 1] = array[j] - array[j + 1];
                                array[j] = array[j] - array[j + 1];
                            }
                        }
                    }
                }
                return array;
            }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM