JavaScript實現常用排序演算法

yvonneit發表於2019-03-09

陣列的隨機排序

var arr = [1,2,3,4,5,6,7,8,9,10];
  	arr.sort(function(){
  		return Math.random() - 0.5;
  	})
  	console.log(arr);
複製程式碼

sort() 預設情況下根據字元編碼進行排序。.sort排序允許接受一個引數(函式),這個函式接受2個形參a,b,並且通過冒泡的方式比較。

//升序
arr.sort(function(a,b){
   return a - b;
})
複製程式碼
var team = [1,2,3,4]
for (var i = 0, len = team.length; i < len; i++) {
  // 隨機選擇一個隊友
  var randomIndex = i + Math.floor(Math.random() * (len - i));
  // 我們倆換換,找別人換過的相當於出列了,因此上面的 randomIndex 需要在剩下的人當中挑選
  var temp = team[i];
  team[i] = team[randomIndex];
  team[randomIndex] = temp;
}
console.log(team);
複製程式碼

氣泡排序

兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。

    function Bubble(arr){
        for(var i=0;i<arr.length-1;i++){
            for(var j=i+1;j<arr.length;j++){
                // 如果前面的大,交換位置
                if(arr[i]>arr[j]){
                    var temp = arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }
複製程式碼

快速排序

  1. 找基準(一般是以中間項為基準)
  2. 遍歷陣列,小於基準的放在left,大於基準的放在right
  3. 遞迴
function quickSort(arr){
   //如果陣列<=1,則直接返回
   if(arr.length<=1){return arr;}
   var pivotIndex=Math.floor(arr.length/2);
   //找基準,並把基準從原陣列刪除
   var pivot=arr.splice(pivotIndex,1)[0];
   //定義左右陣列
   var left=[], right=[];
   //比基準小的放在left,比基準大的放在right
   for(var i=0;i<arr.length;i++){
    if(arr[i]<=pivot){
     left.push(arr[i]);
    }else{
     right.push(arr[i]);
    }
   }
   //遞迴
   return quickSort(left).concat(pivot, quickSort(right));
}
複製程式碼

插入排序(適合小資料量)

直接插入排序的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表 排序過程大概如下:

  1. 從第一個元素開始,該元素可以認為已經被排序;
  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描;
  3. 如果該元素(已排序)大於新元素,將該元素移到下一位置;
  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
  5. 將新元素插入到該位置後;
  6. 重複步驟2~5。
function insertSort(arr){
         var len = arr.length;
           for (var i = 1; i < len; i++) {
              var key = arr[i];//新元素
              var j = i - 1;//預設已排序的元素
              //在已排序好的佇列中從後向前掃描
              while (j >= 0 && arr[j] > key) {
        //已排序的元素大於新元素,將該元素移到下個位置
                  arr[j + 1] = arr[j];
                  j--;
              }
             arr[j + 1] = key;
         }
        return arr;
        }
複製程式碼

最佳情況:輸入陣列按升序排列。T(n) = O(n)

最壞情況:輸入陣列按降序排列。T(n) = O(n2)

平均情況:T(n) = O(n2)

二分插入排序

與直接插排最大的區別在於查詢插入位置時使用的是二分查詢的方式。

  1. 從第一個元素開始,認為該元素已排序;
  2. 取出下一個元素,在已排序序列中二分查詢到第一個比它大的數的位置;
  3. 將元素插入到該位置後;重複上述兩步。

選擇排序

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 再從剩餘未排序元素中繼續尋找最小(大)元素, 放到已排序序列的末尾
  3. 以此類推,直到所有元素均排序完畢。
function selectSort(arr){
        for(var i = 0; i < arr.length - 1; i++){
            var min = arr[i];
            for(var j = i + 1; j < arr.length - 1; j++){
                if(min > arr[j]){
                    var temp = min;
                    min = arr[j];
                    arr[j] = temp;
                }
            }
            arr[i] = min;
        }
        return arr;
    }
複製程式碼

歸併排序

把一系列排好序的子序列合併成為一個大的完整有序序列。

相關文章