有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按升序进行排序,请写出这种排序算法。
时间: 2024-03-16 11:45:00 浏览: 97
双向冒泡排序算法的基本思路是,从左向右冒泡,将最大的元素冒泡到最右边;然后从右向左冒泡,将最小的元素冒泡到最左边。重复这个过程,直到所有元素都排好序。
对于双向链表,我们需要注意的是,链表的节点不仅有值,还有指向前一个节点和后一个节点的指针。因此,在交换两个节点的值时,还需要同时交换它们的前驱和后继节点的指针。
具体实现如下:
```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为链表的长度。
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)