• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    JavaScript實(shí)現(xiàn)的九種排序算法

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:00:26
    文檔

    JavaScript實(shí)現(xiàn)的九種排序算法

    JavaScript實(shí)現(xiàn)的九種排序算法:前言 排序是數(shù)據(jù)結(jié)構(gòu)主要內(nèi)容,并不限于語(yǔ)言主要在于思想;大學(xué)曾經(jīng)用C語(yǔ)言研究過(guò)一段時(shí)間的排序?qū)崿F(xiàn), 這段時(shí)間有空用JS再將排序知識(shí)點(diǎn)熟悉一遍。 下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧 一、代碼匯總(一) 1、冒泡排序 2、改進(jìn)版冒泡排序 3、選擇排
    推薦度:
    導(dǎo)讀JavaScript實(shí)現(xiàn)的九種排序算法:前言 排序是數(shù)據(jù)結(jié)構(gòu)主要內(nèi)容,并不限于語(yǔ)言主要在于思想;大學(xué)曾經(jīng)用C語(yǔ)言研究過(guò)一段時(shí)間的排序?qū)崿F(xiàn), 這段時(shí)間有空用JS再將排序知識(shí)點(diǎn)熟悉一遍。 下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧 一、代碼匯總(一) 1、冒泡排序 2、改進(jìn)版冒泡排序 3、選擇排

    前言

    排序是數(shù)據(jù)結(jié)構(gòu)主要內(nèi)容,并不限于語(yǔ)言主要在于思想;大學(xué)曾經(jīng)用C語(yǔ)言研究過(guò)一段時(shí)間的排序?qū)崿F(xiàn), 這段時(shí)間有空用JS再將排序知識(shí)點(diǎn)熟悉一遍。

    下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

    一、代碼匯總(一)

    1、冒泡排序

    2、改進(jìn)版冒泡排序

    3、選擇排序

    4、直接插入排序

    5、二分插入排序

    /*
     * @Author: laifeipeng 
     * @Date: 2019-02-20 10:00:36 
     * @Last Modified by: laifeipeng
     * @Last Modified time: 2019-02-21 11:57:58
     */
    
    /********* 1、冒泡排序 **********/
    // 很常見(jiàn)很容易理解的排序算法, 排序思路:遍歷數(shù)組,每次遍歷就將最大(或最小)值推至最前。越往后遍歷查詢(xún)次數(shù)越少
    const bubbleSort = arr => {
     const list = arr.slice(); //保證函數(shù)為純函數(shù)
     const len = list.length;
     for (let i = 0; i < len; i++) {
     for (let j = len - 1; j > i; j--) {
     if (list[j] < list[j - 1]) {
     [list[j - 1], list[j]] = [list[j], list[j - 1]];
     }
     }
     }
     return list;
    }
    
    /********* 2、改進(jìn)版冒泡排序 **********/
    // 對(duì)上述冒泡排序的一種優(yōu)化, 優(yōu)化思路:當(dāng)一次遍歷前后數(shù)組不產(chǎn)生變化時(shí),說(shuō)明該數(shù)組已經(jīng)有序,結(jié)束排序。
    const bubbleSort2 = arr => {
     const list = arr.slice(); //保證函數(shù)為純函數(shù)
     const len = list.length;
     for (let i = 0; i < len; i++) {
     let exchange = false;
     for (let j = len - 1; j > i; j--) {
     if (list[j] < list[j - 1]) {
     [list[j - 1], list[j]] = [list[j], list[j - 1]];
     exchange = true;
     }
     }
     if (!exchange) return list
     }
     return list;
    }
    
    /********* 3、選擇排序 **********/
    // 在無(wú)序區(qū)中選出最小的元素,然后將它和無(wú)序區(qū)的第一個(gè)元素交換位置。
    const selectionSort = arr => {
     const list = arr.slice(); //保證函數(shù)為純函數(shù)
     const len = list.length;
     for (let i = 0; i < len; i++) {
     let k = i
     for (let j = len - 1; j > i; j--) {
     if (list[j] < list[k]) k = j;
     }
     if (k !== i) {
     [list[k], list[i]] = [list[i], list[k]];
     }
     }
     return list;
    }
    
    /********* 4、直接插入排序 **********/
    // 每次選擇無(wú)序區(qū)第一個(gè)元素插入到有序區(qū),并排序
    const insertSort = arr => {
     const list = arr.slice(); //保證函數(shù)為純函數(shù)
     const len = list.length;
     for (let i = 1; i < len; i++) {
     const tmp = list[i];
     let j = i - 1;
     while (j >= 0 && tmp < list[j]) {
     list[j + 1] = list[j];
     j--;
     }
     list[j + 1] = tmp;
     }
     return list;
    }
    
    /********* 5、二分插入排序 **********/
    // 插入排序的一種優(yōu)化實(shí)現(xiàn), 通過(guò)二分法減少遍歷時(shí)間(以前是從某邊開(kāi)始依次比較,現(xiàn)在從中間開(kāi)始比較,減少比較次數(shù))
    // 注意,數(shù)組很大才能提現(xiàn)二分插入的優(yōu)勢(shì)
    const insertSort2 = arr => {
     const list = arr.slice(); //保證函數(shù)為純函數(shù)
     const len = list.length;
     for (let i = 1; i < len; i++) {
     const tmp = list[i];
     let low = 0;
     let high = i - 1;
     let j = i - 1;
     while (low <= high) {
     const mid = ~~((low + high) / 2);
     if (tmp < list[mid]) {
     high = mid - 1;
     } else {
     low = mid + 1;
     }
     }
     while (j > high) {
     list[j + 1] = list[j];
     j--;
     }
     list[j + 1] = tmp;
     }
     return list;
    }

    2、代碼匯總(二)

    6、快速排序

    7、原地算法快速排序

    8、希爾排序

    堆排序、歸并排序(js實(shí)現(xiàn)無(wú)優(yōu)勢(shì),不作實(shí)現(xiàn))

    /********* 6、快速排序 **********/
    const quickSort1 = arr => {
     const list = arr.slice(); //為了保證這個(gè)函數(shù)是純函數(shù),拷貝一次數(shù)組
     if (list.length <= 1) return list;
     const pivot = list.splice(0, 1)[0]; //選第一個(gè)作為基數(shù),并把基數(shù)從數(shù)組里面刪除
     const left = [];
     const right = [];
     for (let i = 0, len = list.length; i < len; i++) { //從0開(kāi)始
     if (list[i] < pivot) {
     left.push(list[i]);
     } else {
     right.push(list[i]);
     }
     }
     return [...quickSort(left), pivot, ...quickSort(right)];
    }
    
    // 上面const pivot = list.splice(0, 1)[0]; 如果想直接改為list[0],那么后面循環(huán)的時(shí)候要從i=1開(kāi)始
    const quickSort2 = arr => {
     const list = arr.slice(); //為了保證這個(gè)函數(shù)是純函數(shù),拷貝一次數(shù)組
     if (list.length <= 1) return list;
     const pivot = list[0]; //選第一個(gè)作為基數(shù)
     const left = [];
     const right = [];
     for (let i = 1, len = list.length; i < len; i++) { //從1開(kāi)始
     if (list[i] < pivot) {
     left.push(list[i]);
     } else {
     right.push(list[i]);
     }
     }
     return [...quickSort(left), pivot, ...quickSort(right)];
    }
    
    /********* 7、原地算法快速排序 **********/
    const quickSort = arr => {
     const list = arr.slice() // 為了保證這個(gè)函數(shù)是純函數(shù)拷貝一次數(shù)組
     const sort = (arr, left = 0, right = arr.length - 1) => {
     if (left >= right) {//如果左邊的索引大于等于右邊的索引說(shuō)明整理完畢
     return;
     }
     let i = left;
     let j = right;
     const baseVal = arr[j]; // 取無(wú)序數(shù)組最后一個(gè)數(shù)為基準(zhǔn)值
     while (i < j) { //把所有比基準(zhǔn)值小的數(shù)放在左邊大的數(shù)放在右邊
     while (i < j && arr[i] <= baseVal) { //找到一個(gè)比基準(zhǔn)值大的數(shù)交換
     i++;
     }
     arr[j] = arr[i]; // 將較大的值放在右邊如果沒(méi)有比基準(zhǔn)值大的數(shù)就是將自己賦值給自己(i 等于 j)
     while (j > i && arr[j] >= baseVal) { //找到一個(gè)比基準(zhǔn)值小的數(shù)交換
     j--;
     }
     arr[i] = arr[j]; // 將較小的值放在左邊如果沒(méi)有找到比基準(zhǔn)值小的數(shù)就是將自己賦值給自己(i 等于 j)
     }
     arr[j] = baseVal; // 將基準(zhǔn)值放至中央位置完成一次循環(huán)(這時(shí)候 j 等于 i )
     sort(arr, left, j - 1); // 將左邊的無(wú)序數(shù)組重復(fù)上面的操作
     sort(arr, j + 1, right); // 將右邊的無(wú)序數(shù)組重復(fù)上面的操作
     }
     sort(list);
     return list;
    }
    
    /********* 8、希爾排序 **********/
    // 排序思路:先將整個(gè)待排序記錄序列分割成若干個(gè)子序列,在序列內(nèi)分別進(jìn)行直接插入排序,待整個(gè)序列基本有序時(shí),再對(duì)全體記錄進(jìn)行一次直接插入排序。
    const shellSort = arr => {
     const list = arr.slice(); //保證函數(shù)為純函數(shù)
     const len = list.length;
     let gap = ~~(len / 2);
     while (gap > 0) {
     for (let i = gap; i < len; i++) {
     const tmp = list[i];
     let j = i - gap;
     while (j >= 0 && tmp < list[j]) {
     list[j + gap] = list[j];
     j = j - gap;
     }
     list[j + gap] = tmp;
     }
     gap = ~~(gap / 2);
     }
     return list;
    }

    3、效果圖


    4、解答

    1、如何在控制臺(tái)打印出上面圖片中的彩色效果,eg:

    const logStep = (i, leftArr, rightArr) => 
    console.log(`%c 第${i}趟排序:%c ${arrStr(leftArr)} %c${arrStr(rightArr)} `, 'color:green', 'color:red', 'color:blue');

    2、交換數(shù)組2元素:

    // 交換下標(biāo)為i,k的數(shù)組元素
    [list[k], list[i]] = [list[i], list[k]];

    3、所有源碼github地址:

    https://github.com/laifeipeng/utils/blob/master/sort/sort.js

    4、彩色打印效果的github地址:

    https://github.com/laifeipeng/utils/blob/master/sort/test.js

    總結(jié)

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    JavaScript實(shí)現(xiàn)的九種排序算法

    JavaScript實(shí)現(xiàn)的九種排序算法:前言 排序是數(shù)據(jù)結(jié)構(gòu)主要內(nèi)容,并不限于語(yǔ)言主要在于思想;大學(xué)曾經(jīng)用C語(yǔ)言研究過(guò)一段時(shí)間的排序?qū)崿F(xiàn), 這段時(shí)間有空用JS再將排序知識(shí)點(diǎn)熟悉一遍。 下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧 一、代碼匯總(一) 1、冒泡排序 2、改進(jìn)版冒泡排序 3、選擇排
    推薦度:
    標(biāo)簽: 實(shí)現(xiàn) js javascript
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專(zhuān)題
    Top
    主站蜘蛛池模板: 无码人妻精品中文字幕| 极品精品国产超清自在线观看| 国产日产韩国精品视频| 国产伦精品一区二区三区视频金莲| 精品蜜臀久久久久99网站| 国产精品香港三级国产AV| 亚洲欧美精品综合中文字幕| 97久久精品国产精品青草| 亚洲精品永久在线观看| 国产精品高清在线观看| 大伊香蕉精品视频在线导航 | 亚洲精品无码永久在线观看| 国产成人高清精品免费观看| 99精品视频在线观看re| 久久精品国产清高在天天线| 在线精品自拍无码| 久久这里只有精品视频99| 国产精品部在线观看| 久久久久免费精品国产| 91精品国产综合久久婷婷| 亚洲精品蜜桃久久久久久| 日韩亚洲精品福利| 久久久精品视频免费观看 | 久久精品a亚洲国产v高清不卡| 天天爽夜夜爽8888视频精品| 国产精品无码国模私拍视频| 日本精品在线视频| 国产精品电影网| 国产91大片精品一区在线观看| 国产伦精品一区二区三区| 久久精品国产清高在天天线| 久久精品国产亚洲精品2020| 四虎国产精品永久免费网址| 亚洲av无码乱码国产精品| 无码人妻精品一区二区三| 自拍偷自拍亚洲精品第1页| 中文字幕九七精品乱码| 无码国内精品久久人妻蜜桃| 青青青国产精品一区二区| 久久精品毛片免费观看| 精品久久久久久亚洲精品|