有與下列屬性的陣列的陣列:排序的特殊屬性
對於每個X,Y在A,如果x < y,則x的A中的第一次出現是在y中的第一個出現之前A.
如何在avarage上的O(n)中穩定排序數組A.
我正在學習數據結構中的考試,並且在嘗試解決過去的考試時遇到了這個問題。
有與下列屬性的陣列的陣列:排序的特殊屬性
對於每個X,Y在A,如果x < y,則x的A中的第一次出現是在y中的第一個出現之前A.
如何在avarage上的O(n)中穩定排序數組A.
我正在學習數據結構中的考試,並且在嘗試解決過去的考試時遇到了這個問題。
由於A
的屬性,您知道所有元素的第一次出現已經形成了排序列表。其他事件需要在它們各自的第一次發生後以輸入順序(因爲您想要穩定排序)直接結束。
您需要跟蹤列表中的第一次出現。後面的事件需要在從元素到元素列表的散列表中跟蹤。最後,您可以在第一次出現時迭代列表,並在散列表中收集列表。
僞代碼,這將是這樣的:
list: List(Element)
map: Map(Element -> List(Element))
foreach x in A
if x exists in map
map[x].add(x)
else
map.[x] = [x]
list.add(x)
result = []
foreach x in list
result.concat(map[x])
我在考慮類似的事情,但我認爲我們的兩種算法都會遇到同樣的問題:兩個不同的元素可能會在同一個散列單元中結束。你不覺得這是一個問題嗎? – 2015-02-08 16:46:53
@Doppelganger我不確定你的意思是散列單元。你的意思是兩個不同的元素'x'和'y'可能具有相同的散列值?是的,會發生這種情況,但哈希映射應該對此更健壯,通過使用更可靠的相等性檢查(這就是爲什麼在Java和C#中,您應該始終重寫hashcode和equals實現) – 2015-02-08 16:51:08
提示:使用哈希表(基於比較的排序是Ω(N log n)的,即使在這種特殊情況下)。 – 2015-02-08 15:50:18