成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

排序算法分析總結(jié)(附j(luò)s實(shí)現(xiàn))

liaoyg8023 / 3343人閱讀

摘要:本文對(duì)一些排序算法進(jìn)行了簡(jiǎn)單分析,并給出了的代碼實(shí)現(xiàn)。平均時(shí)間復(fù)雜度不好分析,它是冒泡排序是穩(wěn)定的排序算法。冒泡排序是原地排序算法原地排序指的是空間復(fù)雜度是的排序算法。歸并排序,會(huì)將數(shù)組從中間分成左右兩部分。

本文對(duì)一些排序算法進(jìn)行了簡(jiǎn)單分析,并給出了 javascript 的代碼實(shí)現(xiàn)。因?yàn)楸疚陌舜罅康呐判蛩惴ǎ苑治霾粫?huì)非常詳細(xì),適合有對(duì)排序算法有一定了解的同學(xué)。

本文內(nèi)容其實(shí)不是很多,就是代碼占了很多行。

總覽

默認(rèn)需要排序的數(shù)據(jù)結(jié)構(gòu)為數(shù)組,時(shí)間復(fù)雜度為平均時(shí)間復(fù)雜度。

排序算法 時(shí)間復(fù)雜度 空間復(fù)雜度 是否穩(wěn)定
冒泡排序 O(n^2) O(1) 穩(wěn)定
插入排序 O(n^2) O(1) 穩(wěn)定
選擇排序 O(n^2) O(1) 不穩(wěn)定
歸并排序 O(nlogn) O(n) 穩(wěn)定
快速排序 O(nlogn) O(1) 不穩(wěn)定

下面代碼實(shí)現(xiàn),排序默認(rèn)都是 從小到大 排序。

所有代碼

我的 js 代碼實(shí)現(xiàn)都放在 github:https://github.com/F-star/js-...

代碼僅供參考。

冒泡排序(Bubble Sort)

假設(shè)要進(jìn)行冒泡排序的數(shù)據(jù)長(zhǎng)度為 n。

冒泡排序會(huì)進(jìn)行多次的冒泡操作,每次都會(huì)相鄰數(shù)據(jù)比較,如果前一個(gè)數(shù)據(jù)比后一個(gè)數(shù)據(jù)大,就交換它們的位置(即讓大的數(shù)據(jù)放在后面)。這樣每次交換,至少有一個(gè)元素會(huì)移動(dòng)到排序后應(yīng)該在的位置。重復(fù)冒泡 n(或者說 n-1) 次,就完成了排序。

詳細(xì)來說,第 i(i 從 0 開始) 趟冒泡會(huì)對(duì)數(shù)組的前 n - i 個(gè)元素進(jìn)行比較和交換操作,要對(duì)比的次數(shù)是 size - i - 1

冒泡排序總共要進(jìn)行 n-1 次冒泡(當(dāng)然你可以說是 n 次冒泡,不過最后一次冒泡只有一個(gè)元素,不用進(jìn)行比較)。

優(yōu)化

有時(shí)候,可能只進(jìn)行了 n 次冒泡,數(shù)組就已經(jīng)是有序的了,甚至數(shù)組本來就是有序的。這時(shí)候我們希望:當(dāng)發(fā)現(xiàn)一次冒泡后,數(shù)組有序,就停止下一次的冒泡,返回當(dāng)前的數(shù)組。

這時(shí)候我們可以在每一趟的冒泡前,聲明一個(gè)變量 exchangeFlag,將其設(shè)置為 true。冒泡過程中,如果發(fā)生了數(shù)據(jù)交換,就將 exchangeFlag 設(shè)置為 false。結(jié)束一趟冒泡后,我們就可以通過 exchangeFlag 知道 數(shù)據(jù)是否發(fā)生過交換。如果沒有發(fā)生交換,就說明數(shù)組有序,直接返回該數(shù)組即可;否則說明還沒有排好序,繼續(xù)下一趟冒泡。

代碼實(shí)現(xiàn)
const bubbleSort = (a) => {
    // 每次遍歷找到最大(小)的數(shù)放到最后面的位置。
    // 優(yōu)化:如果某次冒泡操作沒有數(shù)據(jù)交換,說明已經(jīng)有序了。

    // 雙重循環(huán)。
    if (a.length <= 1) return a;
    // 這里的 i < len 改成 i < len - 1 也是正確的,因?yàn)樽詈蟮?len - 1次并不會(huì)執(zhí)行。
    for (let i = 0, len = a.length; i < len; i++) {
        let exchangeFlag = false;   // 是否發(fā)生過換
        for (let j = 0; j < len - i - 1; j++) {
            if (a[j] > a[j + 1]) {
                [a[j], a[j + 1]] = [a[j + 1], a[j]];
                exchangeFlag = true;
            }
            
        }
        console.log(a)
        if (exchangeFlag == false) return a;
    }
}

// 測(cè)試
let array = [199, 3, 1, 2, 8, 21,4, 100, 8];
console.log (bubbleSort(array));
分析 1. 冒泡排序的時(shí)間復(fù)雜度是 O(n^2)

最好時(shí)間復(fù)雜度是 O(n),即第一趟進(jìn)行 n-1 次比較后,發(fā)現(xiàn)原數(shù)組是有序的,結(jié)束冒泡。

最壞時(shí)間復(fù)雜度是 O(n^2),當(dāng)原數(shù)組剛好是倒序排列時(shí),即需要進(jìn)行 n 次冒泡,要進(jìn)行 (n-1) + (n-2) ... + 1 次比較后,用等比數(shù)列求和公式求和后并化簡(jiǎn),即可求出最壞時(shí)間復(fù)雜度。

平均時(shí)間復(fù)雜度不好分析,它是 O(n^2)

2. 冒泡排序是 穩(wěn)定 的排序算法。

這里的“穩(wěn)定”指的是:排序后,值相等的數(shù)據(jù)的前后順序保持不變。

相鄰數(shù)據(jù)如果相等,不交換位置即可。

3. 冒泡排序是原地排序算法

原地排序指的是空間復(fù)雜度是 O(1) 的排序算法。

冒泡排序只做了相鄰數(shù)據(jù)交換,另外有兩個(gè)臨時(shí)變量(交換時(shí)的臨時(shí)變量、flag),只需要常量級(jí)的臨時(shí)空間,空間復(fù)雜度為 O(1)

插入排序(Insertion Sort)

插入排序。本質(zhì)是從 未排序的區(qū)域 內(nèi)取出數(shù)據(jù),放到 已排序區(qū)域 內(nèi),這個(gè)取出的數(shù)據(jù)會(huì)和已排序的區(qū)間內(nèi)數(shù)據(jù)一一對(duì)比,找到正確的位置插入。

我們直接將數(shù)組分為 已排序區(qū)域未排序區(qū)域。剛開始開始,已排序區(qū)域只有一個(gè)元素,即數(shù)組的第一個(gè)元素。插入的方式有兩種:從前往后查找插入 和 從后往前查找插入。這里我選擇 從后往前查找插入。

代碼實(shí)現(xiàn)
const insertionSort = a => {
    for (let i = 0, len = a.length; i < len; i++) {
        let curr = a[i];     // 存儲(chǔ)當(dāng)前值,排序的時(shí)候,它對(duì)應(yīng)的索引指向的值可能會(huì)在排序時(shí)被覆蓋
        for (let j = i - 1; j >= 0;j--) {
            if (curr < a[j]) {
                a[j + 1] = a[j];
            } else {
                break;
            }
            // 找到位置(0 或 curr >= a[j]時(shí))
            a[j] = curr;
        }
    } 
    return a;
}
分析 1. 插入排序的時(shí)間復(fù)雜度是:O(n^2)

當(dāng)要排序的數(shù)據(jù)是有序的,我們每次插入已排序的區(qū)域,只需要比較一次,一共比較 n-1 次就結(jié)束了(注意這里是從后往前遍歷已排序區(qū)域)。所以最好時(shí)間復(fù)雜度為 O(n)。

最壞時(shí)間復(fù)雜度是 O(n^2),是數(shù)據(jù)剛好是倒序的情況,每次都要遍歷完 已排序區(qū)域的所有數(shù)據(jù)。

2. 插入排序是穩(wěn)定排序

遍歷已排序區(qū)域時(shí),值相同的時(shí)候,放到最后的位置即可。

3. 插入排序是原地排序算法

不需要額外空間,是在數(shù)組上進(jìn)行數(shù)據(jù)交換,所以插入排序是原地排序算法。

選擇排序(Selection Sort)

選擇排序也有一個(gè) 已排序區(qū)域 和一個(gè) 未排序區(qū)域。它和插入排序不同的地方在于:選擇排序是從 未排序區(qū)域 中找出最小的值,放到 已排序區(qū)域的末尾。

為了減少內(nèi)存消耗,我們也是直接在數(shù)組上進(jìn)行數(shù)據(jù)的交換。

插入排序比冒泡排序優(yōu)秀的原因

插入排序和冒泡排序的時(shí)間復(fù)雜度都是 O(n^2),元素交換次數(shù)也相同,但插入排序更優(yōu)秀。原因是冒泡排序的交換,需要一個(gè) tmp 的中間變量,來進(jìn)行兩個(gè)元素交換,這就變成了 3 個(gè)賦值操作。而插入排序(從后往前遍歷已排序區(qū)域),不需要中間遍歷,它是直接一些元素后移覆蓋,只要1個(gè)賦值操作。

冒泡排序中數(shù)據(jù)的交換操作:
if (a[j] > a[j+1]) { // 交換
   int tmp = a[j];
   a[j] = a[j+1];
   a[j+1] = tmp;
   flag = true;
}
 
插入排序中數(shù)據(jù)的移動(dòng)操作:
if (a[j] > value) {
  a[j+1] = a[j];  // 數(shù)據(jù)移動(dòng)
} else {
  break;
}

此外,插入排序還可以進(jìn)行優(yōu)化,變成 希爾排序。這里不具體說。

代碼實(shí)現(xiàn)
const selectionSort = a => {
    let tmp;
    for (let i = 0, len = a.length; i < len; i++) {

        let min = a[i],     // 保存最小值,用于比較大小。
            minIndex = i;   // 保存未排序區(qū)間中,最小值對(duì)應(yīng)的索引(方便進(jìn)行元素交換)
        for (let j = i; j < len; j++) {
            if (a[j] < min) {
                minIndex = j;
                min =a[j]
            }
        }
        tmp = a[minIndex];
        a[minIndex] = a[i];
        a[i] = tmp;
    }
    return a;
}
分析 1. 選擇排序的時(shí)間復(fù)雜度是 O(n^2)

最好時(shí)間復(fù)雜度是 O(n^2)。因?yàn)槊看螐奈磁判騾^(qū)域內(nèi)找出最小值,都要遍歷未排序區(qū)域內(nèi)的所有元素,一共要查找 n-1 次,所以時(shí)間復(fù)雜度是 O(n^2)。

最壞時(shí)間復(fù)雜度也是 O(n^2),理由同上。

2. 選擇排序是原地排序算法

我們找到為排序區(qū)域的最小元素,會(huì)交換該元素和 排序區(qū)域的下一個(gè)位置的元素(即排序區(qū)域的第一個(gè)元素),然后 i 后移。只做了元素的交換,且只用到了常數(shù)級(jí)的內(nèi)存空間(交換兩個(gè)數(shù)據(jù)需要的一個(gè)臨時(shí)遍歷),因此選擇排序是原地排序算法。

3. 選擇排序是不穩(wěn)定的排序算法

不穩(wěn)定,是因?yàn)槊看味家易钚≈岛颓懊娴脑剡M(jìn)行交換,這樣會(huì)破壞穩(wěn)定性。舉個(gè)反例來證明:3 3 2, 第一次交換后,為 2 3 3,此時(shí)兩個(gè) 3 的相對(duì)順序就改變了。

當(dāng)然你可以額外的創(chuàng)建一個(gè)大小為數(shù)組長(zhǎng)度的空數(shù)組,來作為 已排序區(qū)域。這樣做就不需要交換元素,可以做到排序穩(wěn)定,但這樣做耗費(fèi)了額外的內(nèi)存,變成了非原地排序算法。

歸并排序

歸并排序用到了 分治思想。分治思想的核心是:將一個(gè)大問題分解成多個(gè)小的問題,解決后合并為原問題。分治通常用遞歸來實(shí)現(xiàn)。分治和遞歸的區(qū)別是,分治是一種解決問題的處理思想,遞歸是一種編程技巧。

歸并排序,會(huì)將數(shù)組從中間分成左右兩部分。然后對(duì)這兩個(gè)部分各自繼續(xù)從中間分成兩部分,直到無法再分。然后將分開的兩部分進(jìn)行排序合并(合并后數(shù)組有序),不停地往上排序合并,最終合并成一個(gè)有序數(shù)組。

說明下 merge 函數(shù)。它是將兩個(gè)有序數(shù)組合并為一個(gè)有序數(shù)組,做法是創(chuàng)建一個(gè)空數(shù)組,長(zhǎng)度為兩個(gè)有序數(shù)組的大的一個(gè)。設(shè)置指針 i 和 j 分指向兩個(gè)數(shù)組的第一個(gè)元素,取其中小的加入數(shù)組,對(duì)應(yīng)的數(shù)組的指針后移。重復(fù)上面這個(gè)過程,直到一個(gè)數(shù)組為空,就將另一個(gè)數(shù)組的剩余元素都推入新數(shù)組。

另外,merge() 函數(shù)可以借助 哨兵 進(jìn)行優(yōu)化處理。具體我沒研究,有空再考慮實(shí)現(xiàn)。

代碼實(shí)現(xiàn)

歸并的代碼實(shí)現(xiàn)用到了遞歸,所以代碼不是很好看懂。

const mergeSort = a => {
    mergeSortC(a, 0, a.length - 1)
    return a;
}

const mergeSortC = (a, p, r) => {
    if (p >= r) return
    let q = Math.floor( (p + r) / 2 ); // 這樣取中間值,right.length >= left.length
    mergeSortC(a, p, q);
    mergeSortC(a, q+1, r);
    merge(a, p, q, r)  // p->q (q+1)->r 區(qū)域的兩個(gè)數(shù)組合并。
}

/**
 * merge方法(將兩個(gè)有序數(shù)組合并成一個(gè)有序數(shù)組)
 */
function merge(a, p, q, r) {
    let i = p,
        j = q+1,
        m = new Array(r - q);    // 保存合并數(shù)據(jù)的數(shù)組
    
    let k = 0;
    while (i <= q && j <= r) {
        if (a[i] <= a[j]) {
            m[k] = a[i];
            i++;
        } else {
            m[k] = a[j]
            j++;
        }
        k++;
    }

    // 首先找出兩個(gè)數(shù)組中,有剩余的元素的數(shù)組。
    // 然后將剩余元素依次放入數(shù)組 m。
    let start = i,
        end = q;
    if (j <= r) {
        start = j;
        end = r;
    }

    while (start <= end) {
        m[k] = a[start];
        start++;
        k++;
    }
    // m的數(shù)據(jù)拷貝到 a。
    for(let i = p; i <= r; i++) {
        a[i] = m[i-p];
    }
}
性能分析 歸并排序的時(shí)間復(fù)雜度是 O(nlogn)

以下為簡(jiǎn)單推導(dǎo)過程,摘自 專欄-「數(shù)據(jù)結(jié)構(gòu)與算法之美」。

問題a分解為子問題 b 和 c,設(shè)求解 a、b、c 的時(shí)間為 T(a)、T(b)、Y(c),則有

T(a) = T(b) + T(c) + K

而合并兩個(gè)有序子數(shù)組的時(shí)間復(fù)雜度是 O(n),于是有

T(1) = C;   n=1 時(shí),只需要常量級(jí)的執(zhí)行時(shí)間,所以表示為 C。
T(n) = 2*T(n/2) + n; n>1

化簡(jiǎn)后,得到 T(n)=Cn+nlog2n。所以歸并排序的時(shí)間復(fù)雜度是 O(nlogn)。

歸并排序是穩(wěn)定的排序

歸并交換元素的情況發(fā)生在 合并 過程,只要讓比較左右兩個(gè)子數(shù)組時(shí)發(fā)現(xiàn)相等時(shí),取左邊數(shù)組的元素,就可以保證有序了。

歸并排序 不是 原地排序

依然歸并排序非常優(yōu)秀(指時(shí)間復(fù)雜度),但,它的空間復(fù)雜度是 O(n)。因?yàn)檫M(jìn)行合并操作時(shí),需要申請(qǐng)一個(gè)臨時(shí)數(shù)組,該數(shù)組的長(zhǎng)度最大不會(huì)超過 n。

快速排序

快速排序,簡(jiǎn)稱 “快排”??炫攀褂玫氖欠謪^(qū)思想。

快排會(huì)取數(shù)組中的一個(gè)元素作為 pivot(分區(qū)點(diǎn)),將數(shù)組分為三部分:

小于 pivot 的部分

pivot

大于或等于 pivot 的部分。

我們?nèi)∽笥覂蛇叺淖訑?shù)組,執(zhí)行和上面所說的操作,直到區(qū)間縮小為0,此時(shí)整個(gè)數(shù)組就變成有序的了。

在歸并排序中,我們用到一個(gè) merge() 合并函數(shù),而在快排中,我們也有一個(gè) partition() 分區(qū)方法。該方法的作用是根據(jù)提供的區(qū)間范圍,隨機(jī)取一個(gè) pivot,將該區(qū)間的數(shù)組的數(shù)據(jù)進(jìn)行交換,最終將小于 pivot 的放左邊,大于 pivot 的放右邊,然后返回此時(shí) pivot 的下標(biāo),作為下一次 遞歸 的參考點(diǎn)。

partition() 分區(qū)函數(shù)有一種巧妙的實(shí)現(xiàn)方式,可以實(shí)現(xiàn)原地排序。處理方式有點(diǎn)類似 選擇排序。首先我們選一個(gè) pivot,pivot 后的元素全都往前移動(dòng)一個(gè)單位,然后pivot 放到末尾。接著我們將從左往右遍歷數(shù)組,如果元素小于 pivot,就放入 “已處理區(qū)域”,具體操作就是類似插入操作那種,進(jìn)行直接地交換;如果沒有就不做操作,繼續(xù)下一個(gè)元素,直到結(jié)束。最后將 pivot 也放 “已處理區(qū)間”。這樣就實(shí)現(xiàn)了原地排序了。

另外,對(duì) partition 進(jìn)行適當(dāng)?shù)母脑欤涂梢詫?shí)現(xiàn) “查找無序數(shù)組內(nèi)第k大元素” 的算法。

代碼實(shí)現(xiàn)
const quickSort = a => {
    quickSortC(a, 0, a.length - 1)
    return a;
}

/**
 * 遞歸函數(shù)
 * 參數(shù)意義同 partition 方法。
 */
function quickSortC(a, q, r) {
    if (q >= r) {
        // 提供的數(shù)組長(zhǎng)度為1時(shí),結(jié)束迭代。
        return a;
    }
    let p = partition(a, q, r);
    quickSortC(a, q, p - 1);
    quickSortC(a, p + 1, r);
}

/**
 * 隨機(jī)選擇一個(gè)元素作為 pivot,進(jìn)行原地分區(qū),最后返回其下標(biāo)
 * 
 * @param {Array} a 要排序的數(shù)組
 * @param {number} p 起始索引
 * @param {number} r 結(jié)束索引
 * @return 基準(zhǔn)的索引值,用于后續(xù)的遞歸。
 */
export function partition(a, p, r) {
    // pivot 默認(rèn)取最后一個(gè),如果取得不是最后一個(gè),就和最后一個(gè)交換位置。
    let pivot = a[r],
        tmp,
        i = p;     // 已排序區(qū)間的末尾索引。
    // 類似選擇排序,把小于 pivot 的元素,放到 已處理區(qū)間
    for (; p < r; p++) {
        if (a[p] < pivot) {
            // 將 a[i] 放到 已處理區(qū)間。
            tmp = a[p];
            a[p] = a[i];
            a[i] = tmp;    // 這里可以簡(jiǎn)寫為 [x, y] = [y, x]
            i++;
        }
    }

    // 將 pivot(即a[r])也放進(jìn) 已處理區(qū)間
    tmp = a[i];
    a[i] = a[r];
    a[r] = tmp;   
    return i;   
}

快速排序和歸并排序都用到了分治思想,遞推公式和遞歸代碼很很相似。它們的區(qū)別在于:歸并排序是 由下而上 的,排序的過程發(fā)生在子數(shù)組合并過程。而快速排序是 由上而下 的,分區(qū)的時(shí)候,數(shù)組就開始趨向于有序,直到最后區(qū)間長(zhǎng)度為1,數(shù)組就變得有序。

性能分析 1. 快速排序的時(shí)間復(fù)雜度是 O(nlogn)

快排的時(shí)間復(fù)雜度遞推求解公式跟歸并是相同的。所以,快排的時(shí)間復(fù)雜度也是 O(nlogn)。但這個(gè)公式成立的前提是每次分區(qū)都能正好將區(qū)間平分(即最好時(shí)間復(fù)雜度)。

當(dāng)然平均復(fù)雜度也是 O(nlongn),不過不好推導(dǎo),就不分析。

極端情況下,數(shù)組的數(shù)據(jù)已經(jīng)有序,且取最后一個(gè)元素為 pivot,這樣的分區(qū)是及其不均等的,共需要做大約 n 次的分區(qū)操作,才能完成快排。每次分區(qū)平均要掃描約 n/2 個(gè)元素。所以,快排的最壞時(shí)間復(fù)雜度是 O(n^2)

2. 快速排序是不穩(wěn)定的排序

快速排序的分區(qū)過程,涉及到了交換操作,該交換操作類似 選擇排序,是不穩(wěn)定的排序。

3. 快速排序是原地排序

為了實(shí)現(xiàn)原地排序,我們前面對(duì) parition 分區(qū)函數(shù)進(jìn)行了巧妙的處理。

結(jié)尾

大概就是這樣,做了簡(jiǎn)單的總結(jié)。如果文章有錯(cuò)誤的地方,請(qǐng)給我留言。

還有一些排序打算下次再更新,可能會(huì)新開一篇文章,也可能直接修改這篇文章。

參考

數(shù)據(jù)結(jié)構(gòu)與算法之美

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103945.html

相關(guān)文章

  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 一個(gè)JAVA渣渣的校招成長(zhǎng)記,BAT美團(tuán)網(wǎng)易等20家面經(jīng)總結(jié)

    摘要:作者重慶森林鏈接來源牛客網(wǎng)整個(gè)三月份通過??途W(wǎng)和網(wǎng)友分享的經(jīng)驗(yàn)學(xué)到了很多東西,現(xiàn)在反饋一下我的面試經(jīng)歷,希望對(duì)同學(xué)們有幫助。個(gè)人情況大三本方向渣碩,經(jīng)過實(shí)驗(yàn)室學(xué)長(zhǎng)內(nèi)推,于三月底完成面試。校招是實(shí)力和運(yùn)氣的結(jié)合,缺一不可。 歡迎關(guān)注我的微信公眾號(hào):Java面試通關(guān)手冊(cè)(堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源,面試題,以及企業(yè)級(jí)Java實(shí)戰(zhàn)項(xiàng)目回復(fù)關(guān)鍵字免費(fèi)領(lǐng)取):showImg(h...

    mozillazg 評(píng)論0 收藏0
  • 前端 排序算法總結(jié)

    摘要:前言排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。本篇將會(huì)總結(jié)一下,在前端的一些排序算法。函數(shù)的性能相信對(duì)于排序算法性能來說,時(shí)間復(fù)雜度是至關(guān)重要的一個(gè)參考因素。 前言 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較你和一個(gè)連快排都不會(huì)寫的人的時(shí)...

    happen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<