簡單排序算法(冒泡排序、插入排序、選擇排序)JS實現

冒泡排序

冒泡排序多是咱們接觸的第一個排序算法了,比較簡單也實用。算法

思路:依次比較相鄰的兩個元素,值大的就換到右邊,一趟循環下來最右邊就是最大的元素了。而後再從頭開始,找第二大的元素,這樣一直走下來,整個數組就有序了。數組

能夠參考如下gif圖,理解冒泡排序的思想。
dom

那麼N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數爲(N-i)次,因此須要比較的次數就是[n(n-1)]/2,即時間複雜度爲 O(n^2)spa

直接上代碼:指針

var bubbleSort = function(array){            //冒泡排序
    var length = array.length
    for (var i = 0; i < length; i++) {
        for (var j = 0; j < length-1-i; j++) {
            if (array[j] > array[j+1]) {
                swap(array, j, j+1);
            }
        }
    }
}

var swap = function(array, index1, index2){        //交換兩個元素的位置
    var aux = array[index1];
    array[index1] = array[index2];
    array[index2] = aux;
}
var createNonSortedArray =function(size){        //建立一個size大小的無序列表ArrayList
    var array = new Array();
    for (var i = size; i > 0; i--) {
        array.push( parseInt(Math.random()*10000));
    }
    return array;
}

var arr = createNonSortedArray(10000);
bubbleSort(arr);

這個代碼不管是最好的狀況(數組有序),仍是最壞狀況(數組逆序),須要比較的次數都是[n(n-1)]/2,也就是時間複雜度均爲 O(n^2),但若是是最好的狀況,一趟比較下來發現沒有元素要交換,那麼時間複雜度就能降到 O(n),故再加一個標誌位,就能讓冒泡排序的最好狀況時間複雜度降到 O(n),以下:code

var bubbleSort = function(array){
    var length = array.length,
    for (var i = 0; i < length; i++) {
        var didSwap = false;            //設置標誌位
        for (var j = 0; j < length-1-i; j++) {
            if (array[j] > array[j+1]) {
                swap(array, j, j+1);
                didSwap = true;
            }
        }
        if(!didSwap) break;                //沒有交換了,直接跳出循環
    }
}

插入排序

思想:一個元素就是有序的,那麼從第二個元素開始,與它以前的元素做比較,若是比以前的元素小,就交換位置。直到比某個元素大,就結束這次循環,也就找到了該元素應該在的位置了。把全部元素都走一遍,整個數組就有序了。排序

能夠參考如下gif圖,理解插入排序的思想。
it

在插入排序中,當待排序數組是有序時,是最優的狀況,只需當前數跟前一個數比較一下就能夠了,這時一共須要比較N-1次,時間複雜度爲 O(n)。io

最壞的狀況是待排序數組是逆序的,此時須要比較次數最多,總次數記爲:1+2+3+…+N-1,因此,插入排序最壞狀況下的時間複雜度爲 O(n^2)。function

var insertionSort = function(array){
    var length = array.length,
        temp, j;
        for(var i = 1; i<length; i++){
        j = i;
        temp = array[i];
        while(j > 0 && array[j-1] > temp){
            array[j] = array[j-1];
            j--;
        }
        array[j] = temp;
    }
}

選擇排序

思想:從數組的第一個元素開始,一趟循環,找出最小的,放到第一個元素的位置,而後從第二個元素開始,重複以前的步驟,直到數組整個有序。

能夠參考如下gif圖,理解選擇排序的思想。
其中橙色表示當前排序趟的最左側元素,綠色是這趟排序找到的最小元素的位置,灰背景是當前比較的指針。

時間複雜度其實與冒泡排序相似,也是一個 O(n)複雜度的算法。
代碼以下:

var selectionSort = function(array){
    var length = array.length,
        indexMin;
    for (var i = 0; i < length-1; i++) {
        indexMin = i;
        for(var j = i;j<length;j++){
          if(array[indexMin] > array[j]){
            indexMin = j;
          }
        }
        if(i != indexMin){
          swap(array, i, indexMin)        //與以前冒泡排序swap方法一致,交換元素位置
        }
    }
}
相關文章
相關標籤/搜索