1. 程式人生 > >js實現陣列排序

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; }

在時間複雜度上表現最穩定的排序演算法之一,用到它的時候,資料規模越小越好。

當然還有很多其他的演算法,比如希爾排序、歸併排序、堆排序等,有興趣的可以自行研究~我這裡也只是記錄一下大家總結的常用的幾種方式,排序具體用什麼方式還是根據實際情況來定。