JS基礎(chǔ)回顧:sort

排序算法

排序也是在程序中經(jīng)常用到的算法。無論使用冒泡排序還是快速排序旧烧,排序的核心是比較兩個(gè)元素的大小影钉。如果是數(shù)字,我們可以直接比較掘剪,但如果是字符串或者兩個(gè)對(duì)象呢平委?直接比較數(shù)學(xué)上的大小是沒有意義的,因此夺谁,比較的過程必須通過函數(shù)抽象出來廉赔。

通常規(guī)定:

對(duì)于兩個(gè)元素x和y肉微,如果認(rèn)為x < y,則返回-1;
如果認(rèn)為x == y蜡塌,則返回0;
如果認(rèn)為x > y碉纳,則返回1;

這樣,排序算法就不用關(guān)心具體的比較過程馏艾,而是根據(jù)比較結(jié)果直接排序劳曹。

JavaScript的Array的sort()方法就是用于排序的,但是排序結(jié)果可能讓你大吃一驚:

/ 看上去正常的結(jié)果:
['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];

// apple排在了最后:
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']

// 無法理解的結(jié)果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

第二個(gè)排序把a(bǔ)pple排在了最后琅摩,是因?yàn)樽址鶕?jù)ASCII碼進(jìn)行排序铁孵,而小寫字母a的ASCII碼在大寫字母之后。

第三個(gè)排序結(jié)果是什么鬼迫吐?簡(jiǎn)單的數(shù)字排序都能錯(cuò)库菲?

這是★★★因?yàn)锳rray的sort()方法默認(rèn)把所有元素先轉(zhuǎn)換為String再排序账忘,結(jié)果'10'排在了'2'的前面志膀,因?yàn)樽址?1'比字符'2'的ASCII碼小。

如果不知道sort()方法的默認(rèn)排序規(guī)則鳖擒,直接對(duì)數(shù)字排序溉浙,絕對(duì)栽進(jìn)坑里!

幸運(yùn)的是蒋荚,sort()方法也是一個(gè)高階函數(shù)戳稽,它還可以接收一個(gè)比較函數(shù)來實(shí)現(xiàn)自定義的排序。

★要按數(shù)字大小排序期升,我們可以這么寫:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
}); // [1, 2, 10, 20]

如果★要倒序排序惊奇,我們可以把大的數(shù)放前面:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return 1;
    }
    if (x > y) {
        return -1;
    }
    return 0;
}); // [20, 10, 2, 1]
★默認(rèn)情況下,Array的sort()方法是對(duì)字符串排序播赁,是按照ASCII的大小比較的.

現(xiàn)在颂郎,我們提出排序應(yīng)該忽略大小寫,★按照字母序排序容为。要實(shí)現(xiàn)這個(gè)算法乓序,不必對(duì)現(xiàn)有代碼大加改動(dòng),只要我們能定義出忽略大小寫的比較算法就可以:

var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
    x1 = s1.toUpperCase();
    x2 = s2.toUpperCase();
    if (x1 < x2) {
        return -1;
    }
    if (x1 > x2) {
        return 1;
    }
    return 0;
}); // ['apple', 'Google', 'Microsoft']

★忽略大小寫來比較兩個(gè)字符串坎背,實(shí)際上就是先把字符串都變成大寫(或者都變成小寫)替劈,再比較。

從上述例子可以看出得滤,高階函數(shù)的抽象能力是非常強(qiáng)大的陨献,而且,核心代碼可以保持得非常簡(jiǎn)潔懂更。

最后友情提示湿故,sort()方法會(huì)直接對(duì)Array進(jìn)行修改阿趁,它返回的結(jié)果仍是當(dāng)前Array:

var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是同一對(duì)象

【補(bǔ)充解釋】:

http://www.imooc.com/wenda/detail/330819?t=199418

Paste_Image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坛猪,隨后出現(xiàn)的幾起案子脖阵,更是在濱河造成了極大的恐慌,老刑警劉巖墅茉,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命黔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡就斤,警方通過查閱死者的電腦和手機(jī)悍募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋机,“玉大人坠宴,你說我怎么就攤上這事”疗欤” “怎么了喜鼓?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衔肢。 經(jīng)常有香客問我庄岖,道長(zhǎng),這世上最難降的妖魔是什么角骤? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任隅忿,我火速辦了婚禮,結(jié)果婚禮上邦尊,老公的妹妹穿的比我還像新娘背桐。我一直安慰自己,他們只是感情好蝉揍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布链峭。 她就那樣靜靜地躺著,像睡著了一般疑苫。 火紅的嫁衣襯著肌膚如雪熏版。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天捍掺,我揣著相機(jī)與錄音撼短,去河邊找鬼。 笑死挺勿,一個(gè)胖子當(dāng)著我的面吹牛曲横,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼禾嫉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼灾杰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熙参,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤艳吠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后孽椰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昭娩,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年黍匾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栏渺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐涯,死狀恐怖磕诊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纹腌,我是刑警寧澤霎终,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站壶笼,受9級(jí)特大地震影響神僵,放射性物質(zhì)發(fā)生泄漏雁刷。R本人自食惡果不足惜覆劈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沛励。 院中可真熱鬧责语,春花似錦、人聲如沸目派。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)企蹭。三九已至白筹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谅摄,已是汗流浹背徒河。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送漠,地道東北人顽照。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親代兵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尼酿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒植影。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,352評(píng)論 0 20
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒裳擎。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解包。 uni...
    思?jí)鬚HP閱讀 1,981評(píng)論 1 24
  • 7. 黃河 農(nóng)業(yè)社會(huì)思币,水是最重要的生產(chǎn)資料之一句惯。中華民族的產(chǎn)生和發(fā)展離不開大江大河的滋養(yǎng),而抵御大型洪澇災(zāi)害也是中...
    張七公子閱讀 555評(píng)論 3 13