狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【JaVAScript】js的五種排序方法(圖文詳解)

admin
2023年6月29日 18:39 本文熱度 671

1.冒泡排序

說明

  1. 比較所有相鄰元素,如果第一個比第二個大,則交換它們。一輪下來保證可以找到一個數(shù)是最大的。執(zhí)行n-1輪,就可以完成排序。

圖示

代碼

//定義一個原生的bubbleSort方法

Array.prototype.bubbleSort = function () {

    for(let i = 0; i < this.length - 1; i += 1) {

        //通過 this.length 次把第一位放到最后,完成排序

        //-i是因?yàn)樽詈蟮奈恢檬菚討B(tài)改變的,當(dāng)完成一次后,最后一位會變成倒數(shù)第二位

        for(let j = 0; j < this.length - 1 - i; j += 1) {

            if(this[j] > this[j+1]) {

                const temp = this[j];

                this[j] = this[j+1];

                this[j+1] = temp;

            }

        }

    }

}

const arr = [4,8,0,1,43,53,22,11,0];

arr.bubbleSort();

console.log(arr);


2.選擇排序

說明

  1. 找到數(shù)組中的最小值,選中它并將其放置在第一位。接著找到第二個最小值,選中它并將其放置到第二位。執(zhí)行n-1輪,就可以完成排序。

圖示

代碼

Array.prototype.selectionSort = function() {

    for(let i = 0; i < this.length - 1; ++i) {

        // 假設(shè)最小的值是當(dāng)前的下標(biāo)

        let indexMin = i;

        //遍歷剩余長度找到最小下標(biāo)

        for(let j = i; j < this.length; ++j) {

            if(this[j] < this[indexMin] ) {

                indexMin = j;

            }

        }

        if(indexMin !== i) {

            //交換當(dāng)前下標(biāo)i與最小下標(biāo)的值,重復(fù)this.length次

            const temp = this[i];

            this[i] = this[indexMin];

            this[indexMin] = temp;

        }

    }

};


3.插入排序

說明

  1. 從第二個數(shù)開始往前比,比它大就往后排,以此類推進(jìn)行到最后一個數(shù)。

圖示:

代碼:

Array.prototype.insertionSort = function() {

    //從第二個數(shù)開始往前比

    for(let i = 1; i<this.length; ++i) {

        //先把值保存起來

        const temp = this[i];

        let j = i;

        while(j > 0) {

            if(this[j-1] > temp) {

                this[j] = this[j-1];

            } else {

                //因?yàn)橐呀?jīng)是排序過的了,如果比上一位大,那就沒必要再跟上上位比較了

                break;

            }

            j -= 1;

        }

        //這里的j有可能是第0位,也有可能是到了一半停止了

        this[j] = temp;

    }

};

const arr = [5,4,3,2,1];

arr.insertionSort();


4.歸并排序

說明:
分: 把數(shù)組劈成兩半,再遞歸地對數(shù)組進(jìn)行“分”操作,直到分成一個個單獨(dú)的數(shù);
合:把兩個數(shù)合并為有序數(shù)組,再對有序數(shù)組進(jìn)行合并,直到全部子數(shù)組合并為一個完整數(shù)組。
圖示:

代碼:

Array.prototype.mergeSort = function () {

    const rec = (arr) => {

        //如果數(shù)組長度為1,說明切完了,可以直接返回

        if (arr.length === 1) { return arr; }

        //切分?jǐn)?shù)組,把每一項(xiàng)都單獨(dú)切出來

        const mid = Math.floor(arr.length / 2);

        const left = arr.slice(0,mid);

        const right = arr.slice(mid,arr.length);

        //有序的左邊數(shù)組

        const orderLeft = rec(left);

        //有序的右邊數(shù)組

        const orderRight = rec(right);

        //定義一個數(shù)組來存放順序數(shù)組

        const res = [];

        // 把左右兩個有序的合并為一個有序的返回

        while(orderLeft.length || orderRight.length) {

            if(orderLeft.length && orderRight.length) {

                res.push(orderLeft[0] < orderRight[0] ? orderLeft.shift() : orderRight.shift())

            } else if (orderLeft.length) {

                res.push(orderLeft.shift());

            } else if (orderRight.length) {

                res.push(orderRight.shift());

            }

        }

        return res;

    };

    const res = rec(this);

    //拷貝到數(shù)組本身

    res.forEach((n,i) => { this[i] = n; });

}

const arr = [5,4,3,2,1];

arr.mergeSort();

console.log(arr);


5.快速排序

說明:
分區(qū):從數(shù)組中任意選擇一個基準(zhǔn),所有比基準(zhǔn)小的元素放到基準(zhǔn)前面,比基準(zhǔn)大的元素放到基準(zhǔn)的后面;
遞歸:遞歸地對基準(zhǔn)前后的子數(shù)組進(jìn)行分區(qū)。

圖示

代碼

Array.prototype.quickSort = function () {

    const rec = (arr) => {

       // 預(yù)防數(shù)組是空的或者只有一個元素, 當(dāng)所有元素都大于等于基準(zhǔn)值就會產(chǎn)生空的數(shù)組

       if(arr.length === 1 || arr.length === 0) { return arr; }

       const left = [];

       const right = [];

       //以第一個元素作為基準(zhǔn)值  

       const mid = arr[0];

       //小于基準(zhǔn)值的放左邊,大于基準(zhǔn)值的放右邊

       for(let i = 1; i < arr.length; ++i) {

           if(arr[i] < mid) {

               left.push(arr[i]);

           } else {

               right.push(arr[i]);

           }

       }

        //遞歸調(diào)用,最后放回數(shù)組   

       return [...rec(left),mid,...rec(right)];

    };

    const res = rec(this);

    res.forEach((n,i) => { this[i] = n; })

}

const arr = [2,3,4,5,3,1];

arr.quickSort();

console.log(arr)



該文章在 2023/6/29 18:41:50 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved