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

資訊專欄INFORMATION COLUMN

算法:排序算法總結(jié)(JavaScript描述)

dkzwm / 2349人閱讀

摘要:二代碼簡(jiǎn)單選擇排序一分析循環(huán)次,每一次的當(dāng)前項(xiàng)與其之后的項(xiàng)作比較,找出其中最小的那個(gè),與當(dāng)前項(xiàng)交換。二代碼希爾排序是一種改進(jìn)版的插入排序,縮小增量排序。這樣做的目的是因?yàn)?,直接插入排序在序列基本有序時(shí)效率最高。

排序算法 平均情況 最好情況 最壞情況 輔助空間 穩(wěn)定性
冒泡排序 O(n^2) O(n) O(n^2) O(1) 穩(wěn)定
簡(jiǎn)單選擇排序 O(n^2) O(n^2) O(n^2) O(1) 穩(wěn)定
直接插入排序 O(n^2) O(n) O(n^2) O(1) 穩(wěn)定
希爾排序 O(nlogn)~O(n^2) O(n^1.3) O(n^2) O(1) 不穩(wěn)定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不穩(wěn)定
歸并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 穩(wěn)定
快速排序 O(nlogn) O(nlogn) O(n^2) O(nlogn)~O(n) 不穩(wěn)定

簡(jiǎn)單算法:冒泡、簡(jiǎn)單選擇、直接插入
改進(jìn)算法:希爾、堆、歸并、快速

后三種改進(jìn)算法比希爾算法效率高,但最好的情況下,冒泡和直接插入最有效,因此如果數(shù)組基本有序,則需要考慮簡(jiǎn)單算法

1. 冒泡排序

一、分析

冒泡arr.length-1趟;

第i趟,比較arr.length-i-1次,兩兩比較,反序則交換位置。

改進(jìn):為了避免已經(jīng)有序的情況下進(jìn)行無意義的兩兩比較,用flag標(biāo)志上一趟是否有交換,沒有交換則已經(jīng)是有序數(shù)組,退出循環(huán)。

二、代碼

    function bubbleSort(arr){
        var flag=true;
        for(let i=0;iarr[j+1]){
                    [arr[j],arr[j+1]]=[arr[j+1],arr[j]];
                    flag=true;
                }
            }
        }
        return arr;
    }
2. 簡(jiǎn)單選擇排序

一、分析

循環(huán)arr.length-1次,每一次的當(dāng)前項(xiàng)與其之后的項(xiàng)作比較,找出其中最小的那個(gè),與當(dāng)前項(xiàng)交換。

二、代碼

    function selectSort(arr){
        var min=0;
        for(let i=0;i
3. 直接插入排序

一、分析

從數(shù)組的第二項(xiàng)開始,循環(huán)arr.length-1次;

將當(dāng)前項(xiàng)的值賦值給臨時(shí)變量:(留出一個(gè)“坑”)為了前面大于當(dāng)前項(xiàng)的項(xiàng)能夠后移;

當(dāng)前項(xiàng)與其前面的項(xiàng)比較,如果大于當(dāng)前項(xiàng)后移,直到找到小于當(dāng)前項(xiàng)的那個(gè),將當(dāng)前項(xiàng)插入其后;

如果前面沒有小于當(dāng)前項(xiàng)的,前面項(xiàng)全部后移以為,當(dāng)前項(xiàng)就插入位置0處。

二、代碼

    function insertSort(arr){
        for(let i=1;i=0&&arr[j]>temp){
                arr[j+1]=arr[j];
                j--;
            }
            arr[j+1]=temp;
        }
        return arr;
    }
4. 希爾排序

??是一種改進(jìn)版的插入排序,“縮小增量排序”。
一、分析

通過增量將待排序列分割成若干個(gè)子序列,每個(gè)子序列進(jìn)行插入排序;

縮小增量,重復(fù)步驟1,直到增量不大于0;

ps:增量等于1時(shí),進(jìn)行了一次全排的直接插入排序。這樣做的目的是因?yàn)?,直接插入排序在序列基本有序時(shí)效率最高。

二、代碼

    function shellSort(arr){
        for(let increment=Math.floor(arr.length/2);increment>0;increment=Math.floor(increment/2)){
            for(let i=increment;i=0&&arr[j]>temp){
                    arr[j+increment]=arr[j];
                    j-=increment;
                }
                arr[j+increment]=temp;
            }
        }
        return arr;
    }
5. 堆排序

一、分析

將待排序列構(gòu)造成一個(gè)大頂堆(位置0處,也就是堆頂,為最大數(shù));

將arr[0]與arr[arr.length-1]進(jìn)行交換,此時(shí)數(shù)組尾為最大值;

調(diào)整0~arr.length-2成一個(gè)大頂堆,繼續(xù)2,直到全部排完。

二、代碼

    function heapSort(arr){
        //1. 構(gòu)造大頂堆
        //2. 頂值最大,交換到最末尾
        //3. 調(diào)整大頂堆
        var len=arr.length;
        for(let i=Math.floor(len/2)-1;i>=0;i--){
            heapAdjust(arr,i,len);
        }
        for(let i=arr.length-1;i>0;i--){
            [arr[0],arr[i]]=[arr[i],arr[0]];
            heapAdjust(arr,0,i);
        }
        return arr;
    }
    function heapAdjust(arr,pos,len){
        var root=pos;
        for(let i=2*pos+1;i
6. 歸并排序

一、分析

將兩個(gè)有序數(shù)組合成一個(gè)有序數(shù)組:歸并。

將一個(gè)數(shù)組分割成長(zhǎng)度為1的數(shù)組,就可以當(dāng)做它是一個(gè)有序數(shù)組,兩兩合并,就成了一個(gè)長(zhǎng)度為2的有序數(shù)組,再兩兩合并,直到排序完成。

二、代碼

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

        let mid=Math.floor(arr.length/2);
        let left=arr.slice(0,mid);
        let right=arr.slice(mid);
        // console.log(left+"+"+right);
        return merge(mergeSort(left),mergeSort(right));
    }
    function merge(left,right){
        var result=[];
        while(left.length>0&&right.length>0){
            if(left[0]
7. 快速排序

一、分析

找基準(zhǔn)

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

遞歸基準(zhǔn)左、右無序序列找基準(zhǔn);

直到輸入數(shù)組長(zhǎng)度為1,跳出遞歸。

二、代碼

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

        let pivot=arr[0];
        let left=[];let right=[];
        for(let i=1;i=arr[low]){
                low++
            }
            [arr[low],arr[high]]=[arr[high],arr[low]];
        }

        return low;
    }

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

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

相關(guān)文章

  • 十大經(jīng)典排序算法總結(jié)(Javascript描述)

    摘要:算法描述冒泡排序是一種簡(jiǎn)單的排序算法。算法描述和實(shí)現(xiàn)一般來說,插入排序都采用在數(shù)組上實(shí)現(xiàn)。平均情況希爾排序年發(fā)明第一個(gè)突破的排序算法是簡(jiǎn)單插入排序的改進(jìn)版它與插入排序的不同之處在于,它會(huì)優(yōu)先比較距離較遠(yuǎn)的元素。 前言 讀者自行嘗試可以想看源碼戳這,博主在github建了個(gè)庫(kù),讀者可以Clone下來本地嘗試。此博文配合源碼體驗(yàn)更棒哦~~~ 個(gè)人博客:Damonare的個(gè)人博客 原文地址:...

    Binguner 評(píng)論0 收藏0
  • 常用排序算法JavaScript實(shí)現(xiàn)

    摘要:代碼實(shí)現(xiàn)六堆排序算法簡(jiǎn)介堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。九計(jì)數(shù)排序算法簡(jiǎn)介計(jì)數(shù)排序是一種穩(wěn)定的排序算法。計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 1、插入排序 1)算法簡(jiǎn)介 插入排序(Insertion-Sort)的算法描述是一種簡(jiǎn)單直觀的排序算法。它...

    jerry 評(píng)論0 收藏0
  • JavaScript實(shí)現(xiàn)插入排序

    摘要:實(shí)現(xiàn)插入排序插入排序是一種非常簡(jiǎn)單的算法,最適合大部分已經(jīng)被排好序的數(shù)據(jù)。由此才有了這個(gè)名字插入排序。插入排序的最壞情況是輸入的數(shù)組是按逆序排序的??偨Y(jié)當(dāng)輸入的數(shù)組已經(jīng)大部分被排好序時(shí),插入排序的效果最佳。 翻譯:瘋狂的技術(shù)宅https://medium.com/@jimrottin... 本文首發(fā)微信公眾號(hào):前端先鋒歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 插入排序的工作原理...

    LittleLiByte 評(píng)論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 歸并排序、快速排序、希爾排序、堆排序

    摘要:之所以把歸并排序快速排序希爾排序堆排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。歸并排序是一種穩(wěn)定的排序方法。因此,快速排序并不穩(wěn)定。希爾排序思想先將整個(gè)待排序的記錄序列分割成為若干子序列。 showImg(https://segmentfault.com/img/bVbvpYZ?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者,前端之路才...

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

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

0條評(píng)論

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