有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按升序进行排序,请写出这种排序算法。
时间: 2024-03-16 20:45:00 浏览: 100
双向冒泡排序算法的基本思路是,从左向右冒泡,将最大的元素冒泡到最右边;然后从右向左冒泡,将最小的元素冒泡到最左边。重复这个过程,直到所有元素都排好序。
对于双向链表,我们需要注意的是,链表的节点不仅有值,还有指向前一个节点和后一个节点的指针。因此,在交换两个节点的值时,还需要同时交换它们的前驱和后继节点的指针。
具体实现如下:
```python
def double_bubble_sort(head):
if not head or not head.next:
return head
tail = None # tail 表示尾节点,初始时为空
while tail != head.next: # 当尾节点到达头结点的后面一个节点时,排序结束
# 从前往后冒泡,将最大的元素冒泡到链表尾部
p = head.next
while p.next != tail:
if p.val > p.next.val:
# 交换相邻两个节点的值
p.val, p.next.val = p.next.val, p.val
# 交换相邻两个节点的前驱和后继节点的指针
p.prev.next, p.next.prev, p.prev, p.next = p.next, p, p.prev, p.next.next
else:
p = p.next
# 更新尾节点
tail = p
# 从后往前冒泡,将最小的元素冒泡到链表头部
p = tail.prev
while p != head:
if p.val > p.next.val:
# 交换相邻两个节点的值
p.val, p.next.val = p.next.val, p.val
# 交换相邻两个节点的前驱和后继节点的指针
p.prev.next, p.next.prev, p.prev, p.next = p.next, p, p.prev, p.next.next
else:
p = p.prev
return head
```
时间复杂度为O(n^2),其中n为链表的长度。
阅读全文
相关推荐


















