筆者最近遇到壹個排序問題。
在群裏問完問題後
壹個小總結
不要懷疑我的食物,沒人愛吃。
?
常規排序,例如:
根據人的年齡上升/下降。壹般我們用Swift內置的sorted來解決這個問題。
排序後會產生新的結果而不影響原來的順序;sort()將結果保存在原始數組中。
?
不知道大家有沒有想過這樣的問題。
精確地
sort排序的原理是什麽?
?
?
Swift內置的排序算法sort()在Swift5之後采用了TimSort,比之前的Introsort更加穩定。
什麽是穩定?
排序後保持相等元素的原始順序的能力。
例如
在真實數據中,可能會影響排序序列的穩定性。
音樂應用根據流行程度對熱門歌曲進行排名。
如果不夠穩定,那麽同樣人氣的歌曲,可能每次的排名結果都不壹樣。
?
TimSort也是壹種混合算法,插入排序O(N2)+歸並排序O(nlogn)。因為插入和合並都是穩定性,所以TimSort也是。
TimSort的核心原理是剪切+合並。
具體實現請參考TimSort。
所以從這個角度來看,排序算法的時間復雜度是O(nlogn)。
?
作者的需求是:
有產地單,但信息不全。您應該通過來源列表的id數組請求具體的詳細列表。
覆蓋原點列表
但是,返回的詳細列表沒有按照ids請求的順序排序(不是升序/降序)。
需要手動排序。
?
標題可以理解為:
?
?
暴力解:雙層for循環,時間復雜度o (n 2)
高階函數:flatMap+filter,類似於暴力解,時間復雜度o (n 2)。
由@SAGES**提出:
平面圖:
將結果合並到壹個新數組中,自動去掉nil,同時解包可選值。
由於嵌套關系和常數的省略,這個解的時間復雜度也是O (n 2)。
?
先將模型數組映射到字典,然後在字典中查找ids映射,時間復雜度為O(n)。
由@Damonwo提出**
總的來說,O(2n)= & gt;所以這個解O(n)
?
我開始想用sort,但是我對sort的理解就像登月壹樣。
停留在表面上,所以
這個解決方案
@ Winter *提議
這個解決方案的第壹步是根據下標將ids數組映射到字典中。
得到
[23: 1, 77: 2, 56: 3, 9: 0, 87: 4]
最後,按指標權重升序,用排序閉包對人的年齡進行排序。
?
最終得到
[77: 2, 9: 0, 87: 5, 56: 4, 23: 1]
?
所以總時間是O(n)+O(n)+O(nlogn),較大的值是O(nlogn)。
?
這個解類似於sort1,時間復雜度為O(nlogn)。
作者@ Tilami Bux * *,提議
優化後,firstIndex步驟也被放入map中,以降低搜索時間的復雜度。
也就是
這個想法相當於sort1。
所以總時間是O(n)+O(nlogn),較大的值是O(nlogn)。
?
在實際開發中
算法的選擇還是很其次的。
不考慮時間復雜度,高階函數會讓Swift優雅;相反,盡量使用較低的時間復雜度。
雖然這是壹個小的條件排序。
?
選擇越多。
會分為優點和缺點
?
歡迎分享自己的方法~