當前位置:成語大全網 - 書法字典 - 對每日Swift數組排序的思考

對每日Swift數組排序的思考

在Swift的日常開發中,或多或少會遇到數組排序。

筆者最近遇到壹個排序問題。

在群裏問完問題後

壹個小總結

不要懷疑我的食物,沒人愛吃。

常規排序,例如:

根據人的年齡上升/下降。壹般我們用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優雅;相反,盡量使用較低的時間復雜度。

雖然這是壹個小的條件排序。

選擇越多。

會分為優點和缺點

歡迎分享自己的方法~