js實現陣列排序
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; }
在時間複雜度上表現最穩定的排序演算法之一,用到它的時候,資料規模越小越好。
當然還有很多其他的演算法,比如希爾排序、歸併排序、堆排序等,有興趣的可以自行研究~我這裡也只是記錄一下大家總結的常用的幾種方式,排序具體用什麼方式還是根據實際情況來定。