我正在尋找一種有效的算法來執行以下操作:給定N個項目的數組,以某種方式對它進行排序,以便項目以M個相等組進行排序,其中每個組是未排序,但組之間彼此排序(一個組中的所有元素都小於下一個組的任何元素)。部分排序爲N個未排序組的有效算法
最簡單的方法是對整個數組進行排序。但效率不高,特別是如果組數遠遠小於項目總數(例如,將100萬項分爲5組)。
目前我已經決定使用quickselect算法(具體來說,它是Floyd-Rivest variation)將數組排序爲2個未分類的組,然後將其應用M-1次。一個顯着的改進可能是採用分而治之的方法來快速選擇,首先將數組分成兩組,然後對每一組進行排序等等,直到我們有M組。一種泛化的unordered partial sorting問題。
但我有一種直覺,認爲可能有一種更簡單,更有效的方法解決問題。有什麼我失蹤?有任何想法嗎?我需要在我的RBush JavaScript library(一種高效的R *樹實現)中提高批量插入性能。
聽起來很棒! – Mourner 2014-08-31 18:59:55
所以,如果我理解你是正確的,那麼可以通過運行一個類似快速排隊的傳球(當你在雙方遞迴而不是一側)來找到所有排名的元素時,對吧?然後,您將對排序的元素進行排序,並在每個排序的元素索引上運行分區子例程,從而產生我需要的未排序組的數組? – Mourner 2014-08-31 19:04:22
@Mourner比這更簡單。您可以在快速選擇的底部找到排名的元素,但不需要它們。你只需要知道這些組是在左邊還是右邊。但是在查找排名元素的過程中,您已經爲從一個點到另一個點的元素生成了很多數組的分區。在回來的路上,你知道每個分區應該進入哪些未排序的組。因此,您可以通過遞歸來查找排名的元素,並且在您將遞歸解決方案排除在外的情況下,將您正在尋找的組合在一起。 – btilly 2014-08-31 19:40:28