Javascript常見演算法整理

東東dd發表於2018-09-13

最近在看《學習Javascript資料結構與演算法》,整理一下書中所提到的排序演算法。

排序演算法

氣泡排序

原理:比較相鄰的項,如果第一個比第二個大,則交換他們
    
        var length = array.length;
        for(var i = 0; i < length; i++){
            for(var j = 0; j < length - i - 1; j++){
                if (array[j] > array[j + 1]) {
                    //es6語法
                    [array[j],array[j+1]] = [array[j+1],array[j]]
                }
            }
        }
    複製程式碼

選擇排序

原理:找到資料結構中最小值並將其放在第一位,接著找到第二小的值放在第二位,以此類推
    
        var length = array.length,indexMin;
        for (var i = 0; i < length; i++) {
            for (var j = i; j < length; j++) {
                if (array[i] > array[j]) {
                    [array[j],array[i]] = [array[i],array[j]]
                }
            }
        }
    複製程式碼

插入排序

原理:假定第一項已經排序,和第二項進行比較,按照大小調整位置,第三項和頭兩項分別進行比較,調整位置,第四項和前三項分別比較,調整位置,以此類推
    
        var length = array.length, j, temp;
        for (var i = 1; i < length; i++) {
            j = i;
            temp = array[j];
            while ( j > 0 && array[j - 1] > temp) {
                array[j] = array[j - 1];
                j--
            }
            array[j] = temp;
        }
    複製程式碼

歸併排序

原理:降原始陣列切分成較小的陣列,知道每個小陣列只有一個位置,接著降小陣列歸併成大陣列,知道最後只有一個排序完畢的大陣列
    
        function merge(left,right) {
            var result = [];
            while (left.length && right.length) {
                if (left[0] < right[0]) {
                    result.push(left.shift());
                } else {
                    result.push(right.shift());
                }
            }
            while(left.length){
                result.push(left.shift());
            }
            while(right.length){
                result.push(right.shift());
            }
            return result;
        }
        function mergeSort(array) {
            if (array.length < 2) {
                return array;
            }
            var length = array.length;
            var midle = parseInt(array.length / 2);
            var left = array.slice(0,midle);
            var right = array.slice(midle,length);
            return merge(mergeSort(left),mergeSort(right));
        }
    複製程式碼

快速排序

  • 首先選擇陣列中間一項作為主元
  • 建立兩個指標,左邊一個指向陣列第一個項,右邊一個指向陣列最後一個項。移動左指標知道我們找到一個比主元大的元素,接著移動右指標知道我們找到一個比主元小的元素,然後交換他們,重複這個過程,知道左指標超過了右指標。整個過程將使得比主元小的值都排在主元之前,而比主元大的值都排在主元之後。這一步叫劃分操作。
  • 接著,演算法對劃分後的小陣列(較主元小的值組成的子陣列,以及較主元大的值組成子陣列)重複之前的兩個步驟,直到陣列已完全排序
    
        function quick (array,left,right) {
            var index;
            if (array.length > 1) {
                index = partition(array,left,right);
                if (left < index - 1) {
                    quick(array,left,index - 1)
                }
                if (index < right) {
                    quick(array,index,right);
                }
            }
        }
        function partition (array,left,right) {
            var pivot = array[Math.floor((right + left) / 2)],
                i = left,
                j = right;
            while(i <= j) {
                while (array[i] < pivot) {
                    i++;
                }
                while (array[j] > pivot) {
                    j--;
                }
                if (i <= j) {
                    [array[i],array[j]] = [array[j],array[i]]
                    i ++;
                    j --;
                }
            }
            return i;
        }
        quick(array,0,array.length - 1);
    複製程式碼

搜尋演算法

順序搜尋

遍歷陣列,逐個對比
    
        function sequentialSearch(array, item) {
            var length = array.length;
            for (var i = 0; i < length; i++) {
                if (array[i] === item) {
                    return i;
                }
            }
            return -1;
        }
    

二分搜尋

**要求被搜尋值已經排序**

1、選擇陣列的中間值

2、如果選擇的值是待搜尋值,那麼演算法執行完畢

3、如果待搜尋值比選中值要小,則返回步驟1並在選中值左邊的子陣列中尋找

4、如果待搜尋值比選中值要大,則返回步驟1並在選中值右邊的子陣列中尋找

function binarySearch (array,item) {
    var low = 0,
        high = array.length - 1,
        mid,element;
    while (low <= high) {
        mid = Math.floor((low + high) / 2);
        element = array[mid];
        if (element < item) {
            low = mid + 1;
        } else if (element > item) {
            high = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}
複製程式碼

相關文章