2015-05-21 60 views
0

我在考慮排序鏈表的方法,我想出了兩種不同的方法(使用BubbleSort,因爲我在編程方面相對較新,對我來說這是最簡單的算法) 。例如結構:排序鏈接列表的方法之間的區別C++

struct node { 
    int value; 
    node *next; 
}; 

的兩種不同的方法:

  • 重新排列列表中的元素
  • 做這樣的事情swap(root->value, root->next->value)

我做了一些谷歌搜索關於這個問題,並從看起來,第一種方法似乎更受歡迎。根據我的經驗,重新排列列表比簡單地交換實際節點值要複雜得多。重新整理整個清單是否有任何好處,如果是,它是什麼?

回答

4

我能想到的兩個優點:

1)其他指針可能存在,指向在該列表中的節點。如果重新排列列表,這些指針仍將指向它們在排序前指向的相同值;如果你換了價值,他們不會。 (這兩個更好取決於你的設計的細節,但有些設計中,如果它們仍然指向相同的值,則更好。)

2)它對列表沒有太大影響僅僅是整數,但最終你可能會對更復雜的事物進行排序,因此交換值是非常昂貴的,甚至是不可能的。

1

由Beta回答,最好重新排列節點(通過下一個指針),而不是交換節點數據。

如果實際使用冒泡排序或任何通過指針「交換」節點的排序,請將下一個(或頭部)指針交換到兩個要首先交換的節點,然後交換這兩個節點下一個指針。這將處理3個指針旋轉的相鄰節點情況以及2對指針交換的正常情況。

另一個簡單的選項是爲排序列表創建一個新的空列表(node * pNew = NULL;)。從原始列表中逐個刪除一個節點,並按順序將該節點插入排序列表中,或者掃描最大節點的原始列表,刪除該節點並在該節點上預先排列已排序的列表。

如果列表很大並且速度很重要,那麼比自下而上的合併排序要快得多。