2015-02-08 113 views
-2

有與下列屬性的陣列的陣列:排序的特殊屬性

對於每個X,Y在A,如果x < y,則x的A中的第一次出現是在y中的第一個出現之前A.

如何在avarage上的O(n)中穩定排序數組A.

我正在學習數據結構中的考試,並且在嘗試解決過去的考試時遇到了這個問題。

+2

提示:使用哈希表(基於比較的排序是Ω(N log n)的,即使在這種特殊情況下)。 – 2015-02-08 15:50:18

回答

1

由於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]) 
+0

我在考慮類似的事情,但我認爲我們的兩種算法都會遇到同樣的問題:兩個不同的元素可能會在同一個散列單元中結束。你不覺得這是一個問題嗎? – 2015-02-08 16:46:53

+0

@Doppelganger我不確定你的意思是散列單元。你的意思是兩個不同的元素'x'和'y'可能具有相同的散列值?是的,會發生這種情況,但哈希映射應該對此更健壯,通過使用更可靠的相等性檢查(這就是爲什麼在Java和C#中,您應該始終重寫hashcode和equals實現) – 2015-02-08 16:51:08