欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript實現(xiàn)基礎排序算法的示例詳解

 更新時間:2022年06月30日 14:26:35   作者:Serendipity  
這篇文章主要為大家詳細介紹了如何利用JavaScript實現(xiàn)基礎排序算法,如:冒泡排序、選擇排序、插入排序和快速排序,感興趣的可以了解一下

前言

文本來總結常見的排序算法,通過 JvavScript  來實現(xiàn)

正文

1、冒泡排序

算法思想:比較相鄰兩個元素的大小,如果第一個比第二個大,就交換它們。從頭遍歷到尾部,當一輪遍歷完后,數(shù)組最后一個元素是最大的。除去最后一個元素,對剩下的元素重復執(zhí)行上面的流程,每次找出剩余元素中最大的,遍歷完后,數(shù)組是升序的

算法分析:總共需要進行l(wèi)ength * (length - 1) / 2 次比較,所以時間復雜度為O(n^2),因為只需要有一個存放常量的空間,元素本身在原數(shù)組上進行交換,所以空間復雜度為O(1)

function bubbleSort(array) {
            if (!Array.isArray(array)) {
                throw new Error('參數(shù)必須為數(shù)組');
                return;
            }
            var n = 0, m = 0 // n表示趟數(shù),m表示比較次數(shù)
            for (let i = array.length - 1; i > 0; i--) { // 外層for表示遍歷的趟數(shù)
                for (let j = 0; j < i; j++) { // 內層for表示每趟需要比較的 j 和 j+1 對應的數(shù)
                    if (arr[j] > arr[j + 1]) {
                        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
                    }
                    m++
                }
                n++
            }
            console.log("遍歷趟數(shù)" + n, "比較次數(shù)" + m);//遍歷趟數(shù)8 比較次數(shù)36
            return array
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(bubbleSort(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]

我們在每一輪循環(huán)中,可以記住最后一次交換的元素,這之后的元素就肯定是已經(jīng)排完序的,這樣可以減少總的循環(huán)次數(shù)

function bubbleSort2(array) {
            if (!Array.isArray(array)) {
                throw new Error('參數(shù)必須為數(shù)組');
                return;
            }
            var n = 0, m = 0 // n表示趟數(shù),m表示比較次數(shù)
            for (var i = array.length - 1; i > 0;) { // 用來表示遍歷 n-1 趟
                var cursor = 0;  // 用來記錄本輪最后一次交換的元素位置
                for (var j = 0; j < i; j++) {
                    if (array[j] > array[j + 1]) {
                        cursor = j;
                        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
                    }
                    m++
                }
                n++
                i = cursor;
                
            }
            console.log("遍歷趟數(shù)" + n, "比較次數(shù)" + m);//遍歷趟數(shù)6 比較次數(shù)29
            return array
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(bubbleSort2(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]

2、選擇排序

實現(xiàn)思路

(1)從頭遍歷到尾部,找出所有項中最大的一個元素

(2)將這個元素和第一個元素交換

(3)對剩下的元素重復進行上面的操作,每次找出剩余中最大的最后的數(shù)組是降序排列的

(4) 算法分析

總共需要進行l(wèi)ength * (length - 1) / 2 次比較,所以時間復雜度為O(n^2),因為只需要有兩個存放常     量的空間,元素本身在原數(shù)組上進行交換,所以空間復雜度為O(1)

function selectSort(array) {
            if (!Array.isArray(array)) {
                throw new Error('參數(shù)必須為數(shù)組');
                return;
            }
            for (let i = 0; i < array.length; i++) {
                var maxIndex = i, maxValue = array[i] // 設置i為最大元素下標
                // 找出剩下元素中的最大值,第一次循環(huán)找出最大值
                for (let j = i + 1; j < array.length; j++) {
                    if (array[j] > maxValue) {
                        maxIndex = j
                        maxValue = array[j]
                    }
                }
                // 如果剩下的元素中最大值下標大于i則發(fā)生交換
                if (maxIndex > i) {
                    [array[i], array[maxIndex]] = [array[maxIndex], array[i]]
                }
            }
            return array
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(selectSort(arr)); //[45, 24, 9, 8, 7, 6, 3, 1, 0]

3、插入排序

實現(xiàn)思路

(1)將數(shù)組前面部分看做有序數(shù)組

(2)每次將后面部分的第一個與已排序數(shù)組作比較,插入到合適的位置

(3)有序數(shù)組初始狀態(tài)有1個數(shù)字

(4)算法分析

(5)時間復雜度為O(n^2)

function insertSort(array) {
            if (!Array.isArray(array)) {
                throw new Error('參數(shù)必須為數(shù)組');
                return;
            }
            for (var i = 1; i < array.length; i++) {
                var temp = array[i] //當前值
                for (var j = i; j > 0 && temp < array[j - 1]; j--) {
                    // 當前值和之前的每個值進行比較,發(fā)現(xiàn)有比當前值小的值就進行重新賦值
                    array[j] = array[j - 1];
                }
                array[j] = temp;
            }
            return array;
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(insertSort(arr)); //[45, 24, 9, 8, 7, 6, 3, 1, 0]

4、快速排序

算法思想:將數(shù)組的第一個數(shù)字作為基準,最后使得基準數(shù)字位于數(shù)組中間某個位置,它的左邊的數(shù)字都比它小,它的右邊的數(shù)字都比它大。

算法實現(xiàn):設置兩個分別指向數(shù)組頭部和尾部的指針i和j,首先向左移動j,使得array[j] 小于基準。然后向右移動i,使得array[i] 大于基準,交換這兩個元素。當i 和j 的值相等時,交換基準與位置i上的元素,然后對i左邊以及右邊的元素分別進行快速排序。

function quickSort(array) {
            const sort = function (arr, left = 0, right = arr.length - 1) {
                if (left >= right) {// 遞歸退出條件
                    return
                }
                let i = left, j = right // 定義兩個指針
                let pivot = arr[i] // 定義基準數(shù)據(jù)

                while (i < j) { // 把所有比基準數(shù)
                    while (j > i && arr[j] >= pivot) { //找到一個比基準值小的數(shù)位置為j
                        j--
                    }
                    arr[i] = arr[j] // 將j的值給了i位置的元素,此時j位置還是原來的數(shù)
                    while (i < j && arr[i] < pivot) {
                        i++
                    }
                    arr[j] = arr[i] // 將i位置的值給了j位置的元素,此時i的位置還是原來的數(shù)
                }
                // 本次交換完畢,此時ij兩個指針重合,把基準值賦值給i即可
                arr[i] = pivot
                sort(arr, left, j - 1) // 將左邊的無序數(shù)組重復上面的操作
                sort(arr, j + 1, right) // 將右邊的無序數(shù)組重復上面的操作
            }
            const newArr = array.concat() // 為了保證這個函數(shù)是純函數(shù)拷貝一次數(shù)組
            sort(newArr)
            return newArr
        }
        var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
        console.log(quickSort(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]

到此這篇關于JavaScript實現(xiàn)基礎排序算法的示例詳解的文章就介紹到這了,更多相關JavaScript排序算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Nuxt.js 數(shù)據(jù)雙向綁定的實現(xiàn)

    Nuxt.js 數(shù)據(jù)雙向綁定的實現(xiàn)

    這篇文章主要介紹了Nuxt.js 數(shù)據(jù)雙向綁定的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 一直都需要的復制到系統(tǒng)剪貼板之IE,firefox兼容版

    一直都需要的復制到系統(tǒng)剪貼板之IE,firefox兼容版

    一直都需要的復制到系統(tǒng)剪貼板之IE,firefox兼容版...
    2007-09-09
  • JS一分鐘在github+Jekyll的博客中添加訪問量功能的實現(xiàn)

    JS一分鐘在github+Jekyll的博客中添加訪問量功能的實現(xiàn)

    這篇文章主要介紹了JS一分鐘在github+Jekyll的博客中添加訪問量功能的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 小程序統(tǒng)計來源信息的方案與具體代碼

    小程序統(tǒng)計來源信息的方案與具體代碼

    微信小程序數(shù)據(jù)統(tǒng)計,現(xiàn)在有很多的統(tǒng)計方法和統(tǒng)計工具,下面這篇文章主要給大家介紹了關于小程序統(tǒng)計來源信息的方案與具體代碼,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • js簡單的彈出框有關閉按鈕

    js簡單的彈出框有關閉按鈕

    這篇文章主要介紹了使用js做的一個簡單的彈出框且有關閉按鈕,需要的朋友可以參考下
    2014-05-05
  • 處理文本部分內容的TextRange對象應用實例

    處理文本部分內容的TextRange對象應用實例

    TextRange是用來表現(xiàn)HTML元素中文字的對象,是一個用于處理JavaScript對象文本部分內容的一個對象
    2014-07-07
  • setTimeout時間設置為0詳細解析

    setTimeout時間設置為0詳細解析

    setTimeout( ) 是屬于 window 的 method, 但我們都是略去 window 這頂層容器名稱, 這是用來設定一個時間, 時間到了, 就會執(zhí)行一個指定的 method,下面這篇文章主要給大家介紹了關于setTimeout時間設置為0的相關資料,需要的朋友可以參考下。
    2018-03-03
  • 理解javascript對象繼承

    理解javascript對象繼承

    這篇文章主要幫助大家理解javascript對象繼承,先從一個問題出發(fā),引入javascript對象繼承相關知識,感興趣的小伙伴們可以參考一下
    2016-04-04
  • JavaScript中exec()方法詳解

    JavaScript中exec()方法詳解

    JavaScript的exec()方法是在正則表達式對象上調用的方法,它用于在字符串中執(zhí)行正則表達式搜索,并返回匹配的結果,本文就給大家詳細的講解JavaScript中exec()方法,感興趣的同學跟著小編一起來看看吧
    2023-09-09
  • Webpack實現(xiàn)按需打包Lodash的幾種方法詳解

    Webpack實現(xiàn)按需打包Lodash的幾種方法詳解

    這篇文章主要給大家介紹了關于Webpack實現(xiàn)按需打包Lodash的幾種方法,文中介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05

最新評論