javascript:算法之數組sort排序


數組sort排序

sort比較次數,sort用法sort常用

描述

方法sort()將在原數組上對數組元素進行排序,即排序時不創建新的數組副本。如果調用方法sort()時沒有使用參數,將按字母順序(更為精確地說,是按照字符編碼的順序)對數組中的元素進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(如果有必要的話),以便進行比較。

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

如果根據你的評判標准,a小於b,在排序后的數組中a應該出現在b之前,就返回一個小於0的值。

如果a等於b,就返回0。

如果a大於b,就返回一個大於0的值。

注意,數組中undefined的元素都排列在數組末尾。即使你提供了自定義的排序函數也是這樣,因為undefined值不會被傳遞給你提供的orderfunc。

示例

下面的代碼展示了如何編寫按數字順序,而不是按字母順序對數組進行排序的比較函數:

// 按照數字順序排序的排序函數

function numberorder(a, b) { return a - b; }

a = new Array(33, 4, 1111, 222);

a.sort(  );             // 按照字母順序的排序結果為: 1111, 222, 33, 4

a.sort(numberorder);    // 按照數字順序的排序結果為: 4, 33, 222, 1111

試驗

//坑1:排序后,影響本身(而非生成新數組) 
//坑2:默認情況下sort方法是按ascii字母順序排序的,而非我們認為是按數字大小排序
  var arr5=[100,19,52,502];
  arr5.sort();                 
  console.log(arr5);     //arr5:[100, 19, 502, 52]  

//用法3:改變默認比較數字大小來排序    加入function(a,b){return a-b}

//疑問4:a,b   代表.. arguments[0]和arguments[1]//
function compare2Val(a,b){return a-b}
var arr6=[100,19,52,502];
arr6.sort(compare2Val); //調用 不需要傳參,
 console.log(arr6); //arr6: [19, 52, 100, 502]

//調用 不需要傳參的本質
 function compare2Argument(){return arguments[0]-arguments[1]}
 var arr7=[100,19,52,502];
arr7.sort(compare2Argument); //[19, 52, 100, 502]
 console.log(arr7); //arr6: [19, 52, 100, 502]



/*************總比較次數結論**************/
//疑問5 總比較次數:n(n-1)/2  n為數組長度

//答:1:各輪比較次數 的和 
//答:2: (數組長度-1+數組長度-2+數組長度-3......+1)  

/*
例數組長度6  比較次數:5+4+3+2+1=15    
例數組長度5   比較次數:4+3+2+1=10    
例數組長度4   比較次數:3+2+1=6    

//高中學的1+2+3+.....+n=?
答案:
設S=1+2+…+(n-1)+n,
則S=n+(n-1)+…+2+1
∴2S=(1+n)+[2+(n-1)]+…+[(n-1)+2]+(n+1)
=n(n+1)
∴S= n(n+1)/2,
即1+2+…+(n-1)+n= n(n+1)/2.
*/

//比較輪數:數組長度-1     每輪比較產生一個最大值放在數組最右,這個最大值不參與下輪比較
//當前輪比較次數:數組長度-當前輪數  
/*************結論**************/

//輪數4()-1  3輪
//第一輪:4-1比較3次    [19,100,52,502]; [19,52,100,502];  [19,52,100,502];  做3次比較
//第二輪:4-2 比較2次   拋棄502,--->[19,52,100,502];  [19,52,100,502];  只做19 52    ,52 100的2次比較
//第三輪:4-3 比較1次   拋棄100,502--->[19,52,100,502];  只做19 52  的1次比較




//5,開發中常用方式  
//例:根據人的年齡排序
function person(name,age){
	this.Name=name;
	this.Age=age
}
var  personArray=[];
personArray.push(new person("LiKe",18));
personArray.push(new person("Tom",58));
personArray.push(new person("Lucy",22));
personArray.push(new person("Haimei",16));

function compareAge(a,b){
	return a.Age-b.Age;
}
personArray.sort(compareAge);
console.log(personArray);//Haimei  LiKe  Lucy Tom  


免責聲明!

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



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