js對數組進行排序的方法還是很多的,最近剛好又有一個實現表格排序功能的需求,本來是讓後臺做的,但由於各種因素推到了前端。嗯,正好回顧一下數組排序的多種實現方式~
1. JavaScript的sort()方法
sort()方法按照升序排列數組項,會調用每個數組項的toString()轉型方法,然後比較得到的字符串。
compare()函數方法是一個比較函數,作爲sort()方法的參數。
function compare(val1,val2){
return val1-val2;
};
array.sort(compare);
這種方法就不必多說了,簡單粗暴,不用寫排序的算法邏輯。
2. 冒泡排序
- (1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個位置。
- (2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- (3)針對所有的元素重複以上的步驟,除了最後一個。
- (4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { //相鄰元素兩兩對比
var temp = arr[j+1]; //元素交換
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
最簡單的排序算法,但如果有追求的話還是不要使用了,因爲有其他更好的實現方式。
3. 快速排序
遞歸思想,兩邊快速的排序,冒泡排序的改進
function quickSort(arr){
//如果數組長度小於等於1,則返回數組本身
if(arr.length<=1){
return arr;
}
//定義中間值的索引
var index = Math.floor(arr.length/2);
//取到中間值
var temp = arr.splice(index,1);
//定義左右部分數組
var left = [];
var right = [];
for(var i=0;i<arr.length;i++){
//如果元素比中間值小,那麼放在左邊,否則放右邊
if(arr[i]<temp){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quickSort(left).concat(temp,quickSort(right));
}
快速排序總結起來就是快,效率高,是處理大數據最快的排序算法之一。快速排序的內循環比大多數排序算法都要短小,這意味着它無論是在理論上還是在實際中都要更快。它的主要缺點是非常脆弱,在實現時要非常小心才能避免低劣的性能。
4.插入排序
function insertSort(arr){
//假設第0元素是有序序列,第1元素之後是無序的序列。從第1元素開始依次將無序序列的元素插入到有序序列中
for(var i=1; i<arr.length;i++){
if(arr[i]<arr[i-1]){
//取出無序序列中需要插入的第i個元素
var temp = arr[i];
//定義有序中的最後一個位置
var j = i-1;
arr[i] = arr[j];
//比較大小,找到插入的位置
while(j>=0&&temp<arr[j]){
arr[j+1] = arr[j];
j--;
};
//插入
arr[j+1] = temp;
}
}
return arr;
}
插入排序算是原理最容易理解的排序方式。
5. 選擇排序
- (1)在未排序序列中找到最小(大)元素
- (2)並存放到排序序列的起始位置
- (3)然後,再從剩餘未排序元素中繼續尋找最小(大)元素
- (4)然後放到已排序序列的末尾。
- (5)以此類推
function selectSort(arr){
for(var i=0;i<arr.length;i++){
//設置當前範圍最小值和索引
var min = arr[i];
var minIndex = i;
//在該範圍選出最小值
for(var j=i+1;j<arr.length;j++){
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
//將最小值插入,並將原來位置的最小值刪除
arr.splice(i,0,min);
arr.splice(minIndex+1,1);
}
return arr;
}
在時間複雜度上表現最穩定的排序算法之一,用到它的時候,數據規模越小越好。
當然還有很多其他的算法,比如希爾排序、歸併排序、堆排序等,有興趣的可以自行研究~我這裏也只是記錄一下大家總結的常用的幾種方式,排序具體用什麼方式還是根據實際情況來定。