常見的三種排序演算法(選擇,冒泡,計數)

東方來客發表於2018-10-11

氣泡排序

氣泡排序的思想:

  • 臨近的兩個元素互相比價,每輪迴圈找出剩餘元素中最大或最小值,將其放於陣列的最後和最前,迴圈的長度減一。
  • 剩餘的元素再重複第一步,直至迴圈的長度等於1,停止迴圈,排序完成。
function bubbleSort(arr){
    var i = arr.length,temp, j;
    while(i!==1){
        for(j=0;j<i-1;j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            }
        }
        i--
    }
    return arr
}
複製程式碼

選擇排序

  • 兩層for迴圈,內層每次預設最值為外層for迴圈的變數為下標。內層for迴圈每次找出最小或最大值的下標。
  • 經過內層迴圈的一次遍歷,將得出的最值與預設的最值位置進行對比,不相等說明預設的最值不是最值,於是交換其值。這樣每次就能從剩的值中找出最值並排序。
function selectSort(arr){
    for(let j=0;j<arr.length-1;j++){
        min = j;
        for(let i= j+1;i<arr.length;i++){
            if(arr[min] > arr[i]){
                min = i;
            }
        }
        if(min !== j){
            let temp;
            temp = arr[min]
            arr[min] = arr[j]
            arr[j] = temp
        }
    }
    return arr
}
複製程式碼

計數排序

  • 找出陣列中最大值,宣告一個臨時陣列。
  • 依靠一個for迴圈向臨時陣列中儲存傳入的陣列中的資料,下標代表其值,陣列中該下標對應的數值為該數字的個數。
  • 另一個for迴圈中迴圈條件小於等於最大值。只要臨時陣列中的值大於0就向目標陣列中儲存,目標陣列下標值每次自增1,臨時陣列的值就減一。 for迴圈完畢即可完成排序。
function countingSort(arr){
    var max = Math.max(..arr);
    var temp = [];
    var num = 0;
    for(let i=0; i<arr.length; i++){
        if(!temp[arr[i]]){
            temp[arr[i]] = 1;
        }else{
            temp[arr[i]]++;
        }
    }
    for(i=0; i<max; i++){
        while(temp[i] > 0){
            arr[num++] = i;
            temp[i]--;
        }
    }
    return arr
}
複製程式碼

相關文章