iOS開發(fā)實戰(zhàn) - 排序算法梳理

前言:

今天看到同事寫的一段排序代碼,我第一反應(yīng)是如果是當(dāng)前這種需求,我不會這樣寫,同時,我又在想他這樣寫是不是有別的意圖,這種寫法有什么好處,還有沒有其他方法可以實現(xiàn),于是就有了這篇文章

  //按字母順序排序 - 升序
  //同事寫法
    NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2];
    }];

  //我會這樣寫 - 相信大多數(shù)人都會這樣寫
    NSArray *sortedArray = [keys sortedArrayUsingSelector:@selector(compare:)];

正文:

首先確定你要比較的元素是同一類型,不然程序會crash
這里只講不可變數(shù)組的排序,可變數(shù)組的排序原理一樣,方法名不同而已;

1. 先來介紹一下- (NSArray *)sortedArrayUsingSelector:(SEL)comparator; 返回一個數(shù)組,并通過給定的比較方法來接收排序后的元素
1.1 如果后面的selectorcompare:則默認(rèn)升序排序,適用于數(shù)組內(nèi)元素為簡單類型的排序,如:字符串、基本數(shù)字類型。如果是字符串類型,則會從第一個字符開始依次比較;數(shù)字類型則直接比較大小,比較簡單,這里不再演示;
   NSArray *arr1 = @[@"lucy",@"2tom",@"lykk",@"john",@"marry"];
  //升序
   NSArray *result1 = [arr1 sortedArrayUsingSelector:@selector(compare:)];
   NSLog(@"升序 = %@",result1);
  //當(dāng)然先這樣實現(xiàn)了升序,但你想要降序,怎么辦?
  //倒序輸出 -> 得到降序數(shù)組
   result1 = [[result1 reverseObjectEnumerator] allObjects];
   NSLog(@"降序 = %@",result1);
1.2 如果后面的selector為自定義方法,適用于復(fù)雜對象的排序,這里我定義一個學(xué)生對象,個人覺得該方法稍麻煩,實際開發(fā)中使用不多。

首先需要去對象的.h文件去聲明排序方法,并去.m文件目錄下實現(xiàn)下。

Student.h

Student.m
外界調(diào)用排序方法排序
驗證排序結(jié)果

注意:這里還有一種情況,就是比較的這兩個元素相等時,這個排序的順序是怎樣的?
我修改了上面stu隊列的兩個地方:
① 將stu4age更改為20
② 改變stu4在原數(shù)組中的位置,下標(biāo)由3變?yōu)?code>1;

我們再來看一下按age排的結(jié)果:


我們可以看到Tomjohnage一樣,但是Tom排在了john的前面,原因是Tom在原始隊列中的位置比john靠前。但是Tom原來的下標(biāo)為1,現(xiàn)在變成了2,可見指定排序規(guī)則的優(yōu)先級最高,如果出現(xiàn)比較元素相等的情況,系統(tǒng)才會默認(rèn)比較原始下標(biāo)。這讓我想到了上學(xué)時班里的成績表,明明我和好幾個同學(xué)的成績一樣,可可為什么我排在了最后面?:

① 當(dāng)成績一樣之后,排名軟件沒做處理,默認(rèn)根據(jù)原始隊列下標(biāo)排序;
② 也可能增加一條比較規(guī)則,再根據(jù)姓名比較/根據(jù)學(xué)號比較;
③ 也可能會出現(xiàn)姓名一樣的情況,這時候再定義一條規(guī)則,根據(jù)學(xué)號來比較(其實這里比較完成績后再根據(jù)學(xué)號比較好,學(xué)號一般在一個學(xué)校里是唯一的)代碼中具體怎么加規(guī)則,下面會提到

2. 接下來我們來介紹一下我同事使用的那種排序方法sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { }];

這是Xcode 4之后出的一個比較好用的一個排序方法,不像自定義排序方法那樣麻煩,個人建議在開發(fā)中復(fù)雜類型的排序用這種方法。

2.1 對簡單類型進(jìn)行排序
排序結(jié)果
2.2 對復(fù)雜對象進(jìn)行排序
排序結(jié)果
3. 高級排序:按描述進(jìn)行排序(制定一套排序規(guī)則 )
排序結(jié)果
4. 總結(jié):

上述簡單的介紹了幾種在OC中排序的方法,有紕漏之處還請大家指出,后續(xù)有時間再補充其他排序方法;當(dāng)然使用冒泡排序/選擇排序等也可以實現(xiàn)上述排序,這里不再代碼演示。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,747評論 2 370

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