簡體   English   中英

鏈表排序方式之間的區別C ++

[英]Difference between ways of sorting linked lists c++

我當時正在考慮對鏈表進行排序的方法,然后我想到了兩種不同的方法(使用BubbleSort,因為我在編程方面相對較新,並且對我來說是最簡單的算法)。 示例結構:

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

兩種不同的方法:

  • 重新排列列表元素
  • 做類似swap(root->value, root->next->value)

我在這個主題上做了一些Google搜索,從外觀上看,第一種方法似乎更受歡迎。 根據我的經驗,重新排列列表比簡單地交換實際節點值要復雜得多。 重新排列整個列表有什么好處,如果是的話,那是什么?

我可以想到兩個優點:

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

2)對於僅是整數的列表並沒有多大關系,但是最終您可能會對一系列更復雜的事物進行排序,因此交換值非常昂貴,甚至是不可能的。

正如Beta回答的那樣,重新安排節點(通過下一個指針)比交換節點數據更好。

如果實際使用冒泡排序或通過指針“交換”節點的任何排序,則將下一個(或頭部)指針交換為要首先交換的兩個節點,然后將這兩個節點的下一個指針交換。 這既處理了旋轉3個指針的相鄰節點情況,又處理了交換2對指針的正常情況。

另一個簡單的選擇是為已排序的列表創建一個新的空列表(節點* pNew = NULL;)。 一次從原始列表中刪除一個節點,然后按順序將該節點插入排序列表中,或者掃描原始列表中最大的節點,刪除該節點並在該列表之前添加該節點。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM