常見的排序算法

前言

作為前端開發(fā)者而言,算法雖然是一種只需要涉獵的領(lǐng)域,但它對(duì)于我而言,確是一道不得不踏過(guò)的檻。原因有倆,其一,前端在遇到復(fù)雜的邏輯問(wèn)題時(shí)可以有更好地去理解與分析;其二,個(gè)人的競(jìng)爭(zhēng)力也會(huì)比較突出(大廠面經(jīng)必備)

友情提示 5道基礎(chǔ)算法題,閱讀時(shí)間為5-10分鐘
下面來(lái)看下有哪些排序算法


冒泡排序

主要思路:比較相鄰兩個(gè)項(xiàng),如果第一個(gè)比第二個(gè)大,就交換位置。

var bubbleSort = function (array) {
    var len = array.length;
    //循環(huán)length不減一,用于獲取數(shù)組循環(huán)輪數(shù),以便于相鄰數(shù)值的比較
    for(var i =0; i < len; i++){
        for(var j =0; j < len - 1; j++){
           if(array[j] > array[j+1]){
               var firstVal = array[j];
               array[j] = array[j+1];
               array[j+1] = firstVal; 
           }
        }
    }
}

選擇排序

選擇排序,也稱為原址比較算法。主要思路是,找到數(shù)據(jù)結(jié)構(gòu)中的最小值并將其放置在第一位,接著找到第二小值放到第二位。以此類推。

var selectionSort = function (array) {
    var indexMin;
    for (var i = 0; i < array.length-1; i++) {
        indexMin = i;

        //循環(huán)length不減一,用于獲取數(shù)組最后一個(gè)元素與前一個(gè)元素進(jìn)行比較
        for (var j = i; j < array.length; j++) {
            if (array[indexMin] > array[j]) {
                indexMin = j;
            }
        }
        if (i !== indexMin) {
            var ux = array[i];
            array[i] = array[indexMin];
            array[indexMin] = ux;
        }
    }
}

插入排序

插入排序,相較前兩種算法性能是有所提高,思路是將第一項(xiàng)與第二項(xiàng)比較,得出正確排序;接著與第三項(xiàng)比較,得出1,2,3項(xiàng)的正確排序,以此類推

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

歸并排序

歸并排序,是一個(gè)比較優(yōu)化的算法,思路是將其遞歸分解數(shù)列,再合并數(shù)列

var mergeSort = function (array) {
    var len = array.length;
    if (len <= 1) {
        return array;
    }
    var mid = Math.floor(len / 2);
    var left = array.slice(0, mid);
    var right = array.slice(mid, len);
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    var i = 0, j = 0, result = [];
    while(i < left.length && j < right.length) {
        if (left[i] > right[j]) {
            result.push(right[j++]);
        } else {
            result.push(left[i++]);
        }
    }
    while (i < left.length) {
        result.push(left[i++]);
    }
    while (j < left.length) {
        result.push(left[j++]);
    }

    return result;
}

快速排序

快速排序,常用的一種排序方法。主要思路是取一個(gè)基準(zhǔn)點(diǎn),以基準(zhǔn)點(diǎn)為中心,分割成小于基準(zhǔn)點(diǎn)或者大于基準(zhǔn)點(diǎn)的兩個(gè)數(shù)組,按順序遞歸排列

var quickSort = function (array) {
    if (array.length <= 1) {
        return array;
    }
    var mid = Math.floor(array.length / 2);
    var temp = array.splice(mid, 1)[0];
    var left = [];
    var right = [];

    for (var i = 0; i < array.length; i++) {
        if (array[i] < temp) {
            left.push(array[i]);
        } else {
            right.push(array[i]);
        }
    }

    return quickSort(left).concat(temp, quickSort(right));
}

思考

這幾種算法有哪些優(yōu)缺點(diǎn)?
首先,選擇排序跟冒泡排序是比較簡(jiǎn)單的算法,然而這兩種排序算法在運(yùn)行性能上都是比較差的。只考慮用于學(xué)習(xí);
其次,插入排序跟前兩者一樣,都是通過(guò)比較來(lái)進(jìn)行排序,在小型數(shù)組方面性能相對(duì)較好,但還是不支持用于實(shí)戰(zhàn);
對(duì)于歸并排序與快速排序而言,兩者的相同點(diǎn)在于采用分治的思想,只不過(guò)快排沒(méi)有將數(shù)組切割。而在實(shí)用性方面,歸并與快排都是能進(jìn)行實(shí)用的算法,但快排應(yīng)該是最常用的一種。
其他排序算法呢?
其實(shí)排序算法還有堆排序、希爾排序、計(jì)數(shù)排序、桶排序、基數(shù)排序等,只不過(guò)對(duì)這幾種掌握不深,不敢班門弄斧。后面對(duì)算法更熟悉些,會(huì)進(jìn)行這幾種算法的學(xué)習(xí)并且與前幾種算法的優(yōu)勢(shì)比較

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,532評(píng)論 0 1
  • 背景 按照相關(guān)排序算法的解釋,手動(dòng)用Python實(shí)現(xiàn)了一遍,記錄一下。(部分代碼是摘自網(wǎng)上)排序結(jié)果為從小到大。 ...
    ikaroskun閱讀 471評(píng)論 0 2
  • 冒泡排序 冒泡排序是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交...
    小小的白菜閱讀 301評(píng)論 0 1
  • 本文是lhyt本人原創(chuàng),希望用通俗易懂的方法來(lái)理解一些細(xì)節(jié)和難點(diǎn)。轉(zhuǎn)載時(shí)請(qǐng)注明出處。文章最早出現(xiàn)于本人github...
    lhyt閱讀 322評(píng)論 0 0
  • 大家好,我是IT修真院深圳分院第01期學(xué)員,一枚正直善良的web程序員。 今天給大家分享一下,修真院官網(wǎng) JS任務(wù)...
    長(zhǎng)天_閱讀 922評(píng)論 0 2

友情鏈接更多精彩內(nèi)容