JavaScript數組中有一個reverse()
方法,可用於反轉數組,以下代碼所示:javascript
var arr = [0, 1, 2, 3]; arr.reverse(); console.log(arr);//[3, 2, 1, 0]
可是多數狀況下這並不能知足開發的需求,真實的狀況每每是降序或升序排列。對數組進行排序很天然地會想到冒泡排序算法,下面咱們來看一個例子:java
var arr = [8, 1, 35, 3, 10]; // 冒泡排序 升序 function bubbleSort(arr){ var temp; for(var i = 0; i < arr.length; i++){ for(var j = i + 1; j < arr.length; j++){ if(arr[i] > arr[j]){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } return arr; } console.log(bubbleSort(arr));//[1, 3, 8, 10, 35]
這段代碼有兩個for
循環,實現的思路是用外層循環依次取出每一個元素,用內層循環和剩下的元素進行比較,若是取出的這個數較大,就與較小的數交換位置,這樣一輪內循環結束,最小的數就成了第一個元素,依次第二小的數成爲第二個元素...。用下面這幅圖能夠幫助理解: 算法
如圖所示,i = 0
時,取出數組的第一個元素,和以後的每一個元素比較,若是大於後面的元素就交換位置,這樣當j
從1
到4
結束時,數組的第一個元素就是最小的元素。類似的,i = 1
時,取出的是數組的第二個元素,依次和後面的每一個元素比較,當j
從2
到4
結束時,數組的第二個元素就是第二小的元素。數組
從比較的過程也容易計算出比較的次數:函數
4 + 3 + 2 + 1 = n(n + 1) / 2 = (arr.length - 1)arr.length / 2 = 10
3d
另外一種思路是把相鄰的兩個元素進行比較,若是前者較大就交換兩者的位置,這樣一輪內循環結束後,最大的元素就是數組的最後一個元素,以下例所示:code
function bubbleSort2(arr){ var temp; for(var i = 0; i < arr.length - 1; i++){ for(var j = 0; j < arr.length - 1 - i; j++){ if(arr[j] > arr[j + 1]){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } console.log(bubbleSort2(arr));//[1, 3, 8, 10, 35]
一樣畫一個圖來表示: blog
i = 0
時,j
從0
到3
循環,依次比較相鄰的兩個數,前者大就交換,這樣最大的數就像冒泡同樣冒到了最後;i = 1
時,第二大的數冒到了倒數第二的位置。排序
一樣也容易計算出比較的次數:ip
4 + 3 + 2 + 1 = n(n + 1) / 2 = (arr.length - 1)arr.length / 2 = 10
和第一種思路比較的次數是同樣的,只是從過程來看,第二種思路改名副其實一些。
其實對於這種經常使用的升降排序,JavaScript給咱們提供了一個更方便的方法:sort()
。
在默認狀況下,sort()
方法按升序排列數組元素,爲了實現排序,sort()
方法會調用每一個元素的toString()
轉型方法,而後比較獲得的字符串,以肯定如何排序。即便數組的每一個元素都是數值,sort()
方法比較的也是字符串,以下所示:
arr.sort(); console.log(arr);//[1, 10, 3, 35, 8]
如結果所示,按照字符串順序'10'
排在'1'
的後面,'3'
排在'10'
的後面,'8'
是最大的排在最後。顯然這並非咱們但願的結果,所以,sort()
方法能夠接收一個比較函數做爲參數,以便咱們指定哪一個值位於哪一個值前面。看下面的示例:
function compare(v1, v2){ if(v1 < v2){ return -1; }else if(v1 > v2){ return 1; }else{ return 0; } } arr.sort(compare); console.log(arr);//[1, 3, 8, 10, 35]
如代碼所示,聲明一個compare
比較函數,它接收兩個參數。compare
傳遞給sort
方法時,參數能夠映射到數組的元素,若是第一個參數應該位於第二個參數以前則返回一個負數,若是兩個參數相等則返回0
,若是第一個參數應該位於第二個參數以後則返回一個正數。這裏當v1 < v2
時返回-1
,也就是v1 < v2
時,v1
應該位於v2
以前,即升序。
固然若是想降序排列也很容易,只要改變返回值就行了,-1
改成1
,1
改成-1
,以下所示:
function compare(v1, v2){ if(v1 < v2){ return 1; }else if(v1 > v2){ return -1; }else{ return 0; } } arr.sort(compare); console.log(arr);//[35, 10, 8, 3, 1]
由於起關鍵做用的是返回值的正負與否,因此也可使用下面這樣更簡化的方式:
//升序 function ascSort(v1, v2) { return v1 - v2; } arr.sort(ascSort); console.log(arr);//[1, 3, 8, 10, 35] //降序 function descSort(v1, v2){ return v2 - v1; } arr.sort(descSort); console.log(arr);//[35, 10, 8, 3, 1]
總結一句就是若是隻是想反轉數組,可使用reverse()
方法,若是想對數組進行升序或降序排列,可使用sort()
方法。