數組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