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

資訊專欄INFORMATION COLUMN

小試牛刀之sort()排序的實(shí)現(xiàn)

Barrior / 1049人閱讀

摘要:比較函數(shù)應(yīng)該具有兩個(gè)參數(shù)和,其返回值如下若小于,在排序后的數(shù)組中應(yīng)該出現(xiàn)在之前,則返回一個(gè)小于的值。把這個(gè)安排好,再繼續(xù)之前的冒泡排序。

受大學(xué)室友的鼓動(dòng),我也打算利用公眾平臺(tái)來記錄自己的前端知識(shí)積累,同時(shí)呢,自己總結(jié)的東西,總歸會(huì)有局限性,希望小伙伴能給我指點(diǎn)迷津。知識(shí)就是一張巨大的網(wǎng),作為一名摸不清頭緒的入學(xué)者,唯一能做的事情就是吐好每一根絲,絲擰成線,線再織成網(wǎng)。好啦,開機(jī)儀式over,廢話不多說了啦...

關(guān)于Sort()這個(gè)函數(shù),決定研究它是因?yàn)樵诳慈罾蠋煹募^函數(shù)時(shí),最后有一個(gè)小練習(xí):
請(qǐng)使用箭頭函數(shù)簡(jiǎn)化排序時(shí)傳入的函數(shù):

var arr = [10, 20, 1, 2];
arr.sort((x, y) => {
    ???
});
console.log(arr); // [1, 2, 10, 20]

因?yàn)橹癹s基礎(chǔ)也不扎實(shí),沒有g(shù)et到這個(gè)題的核心,想了想寫了寫,最后放棄了,看了評(píng)論里的答案。我的天,就一句——return x - y;,當(dāng)時(shí)我就覺得這個(gè)函數(shù)太神奇了,這么簡(jiǎn)單的解決了數(shù)組排序。(上大學(xué)那會(huì),懶惰致死的我所有排序算法原理都明明白白,但是從來沒有寫過,于是就...后悔莫及阿)

sort()函數(shù)定義

了解原理先從函數(shù)定義入手,于是乎...從W3C上搬了一段解釋:

定義和用法: sort() 方法用于對(duì)數(shù)組的元素進(jìn)行排序。

語法: arrayObject.sort(sortby)

返回值: 對(duì)數(shù)組的引用。請(qǐng)注意,數(shù)組在原數(shù)組上進(jìn)行排序,不生成副本。

說明:

如果調(diào)用該方法時(shí)沒有使用參數(shù),將按字母順序?qū)?shù)組中的元素進(jìn)行排序,說得更精確點(diǎn),是按照字符編碼的順序進(jìn)行排序。要實(shí)現(xiàn)這一點(diǎn),首先應(yīng)把數(shù)組的元素都轉(zhuǎn)換成字符串(如有必要),以便進(jìn)行比較。

如果想按照其他標(biāo)準(zhǔn)進(jìn)行排序,就需要提供比較函數(shù),該函數(shù)要比較兩個(gè)值,然后返回一個(gè)用于說明這兩個(gè)值的相對(duì)順序的數(shù)字。比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b,其返回值如下:
若 a 小于 b,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前,則返回一個(gè)小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個(gè)大于 0 的值。

sort排序的過程中發(fā)生了什么呢

怎么查看sort()方法是如果實(shí)現(xiàn)排序的呢?此處參考了前輩的文章《sort排序到底怎么排序》。因?yàn)槲揖吞貏e傻,斷點(diǎn)打到sort()函數(shù)這一行,然后step-into執(zhí)行,不斷在console里打印arr。。。傻的一p
前輩如下實(shí)現(xiàn)的:我們可以在比較函數(shù)里把a(bǔ),b及數(shù)組輸出一下,看看是否能夠看出使用的排序算法。

var arr=[1, 8, 3, 5, -1];
function compare(a,b){
    console.log(a,b,arr);
    return a-b;
}
arr.sort(compare);

控制臺(tái)輸出
1 8 [1, 8, 3, 5, -1]
8 3 [1, 8, 3, 5, -1]
1 3 [1, 8, 8, 5, -1]
8 5 [1, 3, 8, 5, -1]
3 5 [1, 3, 8, 8, -1]
8 -1 [1, 3, 5, 8, -1]
5 -1 [1, 3, 5, 8, 8]
3 -1 [1, 3, 5, 5, 8]
1 -1 [1, 3, 3, 5, 8]
[-1,1, 3, 5, 8]
*/
? 第一次1和8比較,1<8,不需要調(diào)整位置。 ??

  第二次8和3比較,8>3,需要調(diào)整位置。但是這里沒有交換位置,僅僅是8覆蓋了3位置。這里就可以推斷出不是單純的使用了冒泡算法。
??第三是1和3比較,1<3,3替換了8的位置。什么鬼,幾個(gè)意思???看到這里我也是表示不懂呀。那就繼續(xù)往下看咯。 ??

  第四是8和5比較,8>5,又僅僅是覆蓋,沒有交換位置。還是不懂,繼續(xù)往下!
??第五是3和5比較,3<5,5替換了8的位置,不懂,繼續(xù)往下! ??

  第六是8和-1比較,8>-1, 還僅僅是覆蓋,繼續(xù)往下!
??第七、八、九次,-1依次和5,3,1做了比較,并且5,3,1都移動(dòng)了一次位置。

  我們得出了結(jié)論:sort()方法是使用的冒泡和插入兩種方式結(jié)合進(jìn)行排序的。

回顧冒泡和插入排序

這里我用自己的話總結(jié)一下:
冒泡排序:

第一輪:從第一個(gè)元素開始,相鄰元素比較,前者比后者大,互換位置,下標(biāo)加一;再繼續(xù)相鄰元素比較,大的元素移到后面,下標(biāo)加一再比較...這樣一輪比較下來,最后一個(gè)元素一定是數(shù)組里最大的元素。

第二輪及之后:好啦,現(xiàn)在最后一個(gè)元素(即最大的元素)確定了,將其排除在外,我們?cè)賮韽念^對(duì)比除它之外的元素,將倒數(shù)第二大的元素移到倒數(shù)第二個(gè)位置。以此類推,每一輪確定一個(gè)元素的位置,就像小魚吐泡泡一樣,大的泡泡一點(diǎn)一點(diǎn)往上移

function bubbel(arr) {
    var len=arr.length;
    for(var i=0; i arr[j+1]) {
                var temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    return arr;
}

插入排序:
1.第一輪:將第一個(gè)元素看成只有一個(gè)元素的有序數(shù)組,拿第二個(gè)元素和它比較,比它小就插到它前面,比它大就插到它后面。
2.第二輪:經(jīng)過第一輪,前兩個(gè)元素已為有序數(shù)組。再拿第三個(gè)元素和前兩個(gè)元素比較,看插在哪合適。以此類推。一般會(huì)新建一個(gè)數(shù)組記錄排序后的數(shù)組。

// 插入排序 從下標(biāo)1開始每增1項(xiàng)排序一次,越往后遍歷次數(shù)越多
function sort1(array) {
  var len = array.length,
      i, j, tmp, result;
  
  // 設(shè)置數(shù)組副本
  result = array.slice(0);
  for(i=1; i < len; i++){
    tmp = result[i];
    j = i - 1;
    while(j>=0 && tmp < result[j]){
      result[j+1] = result[j];
      j--;
    }
    result[j+1] = tmp;
  }
  return result;
}
sort()的真面目來啦

前面鋪墊了這么多,終于到了今天的重點(diǎn)——冒泡排序和插入排序是如何混合使用的?即sort()實(shí)現(xiàn)的原理。先上我的代碼!! 時(shí)隔多年,我終于不再懶惰,勇敢寫出我的代碼。希望努力不要太晚~

var arr = [1, 8, 3, 5, -1];
    var len = arr.length;
    function compareSet(temp, compare_i){
        for(var i = compare_i; i > 0; i--){
            if(temp > arr[i-1]){
                arr[i] = temp;
                break;
            }
            else{
                arr[i] = arr[i-1];
                arr[i-1] = temp;
            }
        }
    }
    for(var i = 0; i < len; i++){
        if(arr[i] > arr[i+1]){
            var temp = arr[i+1];
            arr[i+1] = arr[i];
            console.log(arr);            
            compareSet(temp, i);
        }
        
    }
    console.log(arr);

根據(jù)之前分析sort()排序控制臺(tái)輸出,先是像冒泡排序那樣相鄰的元素比較。但是,一旦出現(xiàn)需要換位置的操作時(shí),不再是像插入排序那樣直接交換。而是先用變量temp暫存arr[i+1],再將較大的arr[i]移到[i+1]位置上,對(duì)暫存變量temp使用插入排序,將其插入前0 ~ [i-1]有序數(shù)組中。把這個(gè)temp安排好,再繼續(xù)之前的冒泡排序。
**冒泡排序是元素對(duì)調(diào)后這一輪就不管事了,要重復(fù)i-1輪冒泡。
插入排序是不管現(xiàn)有元素的順序是否正確,都給你在已有序數(shù)組從頭比較到尾。**
所以,混合起來666。

這里還有一個(gè)前輩寫的sort()實(shí)現(xiàn),我對(duì)比一下,我的運(yùn)行速度18ms,前輩的25ms。其實(shí)我感覺我寫的沒有前輩的簡(jiǎn)潔,但不知道為什么我的快一些。之后再仔細(xì)研究研究。

            [function findMinIndex(arr,start){
                var iMin=arr[start];
                var iMinIndex=start;
                for(var i=start;iarr[i]){
                        iMin=arr[i];
                        iMinIndex=i;
                    }
                }
                return iMinIndex;
            }
            for(var i=0;i

其實(shí),寫到這里,應(yīng)該結(jié)束了!但是我忽然想起來,大學(xué)《數(shù)據(jù)結(jié)構(gòu)》課上,我最喜歡的魏萊老師好像給我們說過這個(gè)混合排序算法的。老師一步步引導(dǎo)我們思考的場(chǎng)景還歷歷在目,我甚至都可以回想起老師說話時(shí)的語氣。可是,我卻還的差不多了,實(shí)在是可惡?。?!

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

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

相關(guān)文章

  • Datatables表格插件學(xué)習(xí)

    摘要:是一款表格插件。當(dāng)你打開服務(wù)器模式的時(shí)候,每次繪制表格的時(shí)候,會(huì)給服務(wù)器發(fā)送一個(gè)請(qǐng)求包括當(dāng)前分頁,排序,搜索參數(shù)等等。開啟服務(wù)器模式需要使用和不定時(shí)一講選項(xiàng),進(jìn)一步的信息,請(qǐng)參考下面的配置選項(xiàng)。 Datatables 是一款jquery表格插件。它是一個(gè)高度靈活的工具,可以將任何HTML表格添加高級(jí)的交互功能,可以很方便的實(shí)現(xiàn)分頁,即時(shí)搜索和排序。 一、簡(jiǎn)單使用 怎樣簡(jiǎn)單地使用Data...

    Lyux 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法——堆應(yīng)用

    摘要:我們可以維護(hù)一個(gè)大小為的小頂堆,然后依次遍歷數(shù)組,如果數(shù)組數(shù)據(jù)比堆頂元素大,則插入到堆中,如果小,則不做處理。我們可以維護(hù)一個(gè)大頂堆,一個(gè)小頂堆,小頂堆中存儲(chǔ)后個(gè)數(shù)據(jù),大頂堆中存儲(chǔ)前面剩余的數(shù)據(jù)。 1. 概述 前面說完了堆這種數(shù)據(jù)結(jié)構(gòu),并且講到了它很經(jīng)典的一個(gè)應(yīng)用:堆排序,其實(shí)堆這種數(shù)據(jù)結(jié)構(gòu)還有其他很多的應(yīng)用,今天就一起來看看,主要有下列內(nèi)容: 優(yōu)先級(jí)隊(duì)列 求 Top K 問題 求...

    zhiwei 評(píng)論0 收藏0
  • js 排序算法快速排序

    摘要:快速排序是一種劃分交換排序??焖倥判蚧诿芭葸f歸分治。他在大數(shù)據(jù)情況下是最快的排序算法之一,平均事件復(fù)雜度很低而且前面的系數(shù)很小,在大量隨機(jī)輸入的情況下最壞情況出現(xiàn)的概率是極小的。 快速排序是一種劃分交換排序。它采用了一種分治的策略,通常稱其為分治法。 分治法的基本思想是:將原問題分解為若干個(gè)規(guī)模更小但結(jié)構(gòu)與原問題相似的子問題。遞歸地解這些子問題,然后將這些子問題的解組合為原問題的解。...

    Eidesen 評(píng)論0 收藏0
  • PHP算法四大基礎(chǔ)算法

    摘要:而在證明算法是正確的基礎(chǔ)上,第二步就是分析算法的時(shí)間復(fù)雜度。算法的時(shí)間復(fù)雜度反映了程序執(zhí)行時(shí)間隨輸入規(guī)模增長(zhǎng)而增長(zhǎng)的量級(jí),在很大程度上能很好反映出算法的優(yōu)劣與否。 showImg(https://segmentfault.com/img/remote/1460000016451712?w=800&h=341); 前言 雖然工作中,你覺得自己并沒有涉及到算法這方面的東西,但是算法是程序的...

    isLishude 評(píng)論0 收藏0
  • 數(shù)組方法sort()詳解

    摘要:大家都知道,在的數(shù)組方法中,有一個(gè)方法,可以直接調(diào)用對(duì)數(shù)組進(jìn)行排序。例如輸出在默認(rèn)情況下,會(huì)按照升序排列數(shù)組項(xiàng),需要注意的是方法會(huì)改變?cè)瓉淼臄?shù)組。注意即使數(shù)組中的每一項(xiàng)都是數(shù)字,方法比較的也是字串。 大家都知道,在JS的數(shù)組方法中,有一個(gè)sort()方法,可以直接調(diào)用對(duì)數(shù)組進(jìn)行排序。例如: var arr1=[1,5,8,9,7,2]; arr1.sort(); console.log...

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

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

0條評(píng)論

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