基于双向链表的双向冒泡排序法

发布时间: 2018年11月26日 10:09   时间限制: 1000ms   内存限制: 128M

习题集源码中出现了 temp->next->prior = p; 本人推断这里缺少预先的对temp->next==NULL这种情况的判定,所以需加入一个判断语句解决。

此为非循环的双向链表,末尾空指针没有前驱,与循环双向链表有所不同。

描述

有n个记录存储在带头结点的双向链表中,利用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)。

输入

多组数据,每组数据两行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数)。当n等于0时,输入结束。

输出

每组数据输出一行,为从小到大排序后的序列。每两个元素之间用空格隔开。

样例输入1

5
4 5 3 2 9
6
1 3 5 7 9 2
0

样例输出1

2 3 4 5 9
1 2 3 5 7 9
 1 //双向冒泡,最大沉底,最小冒出
 2 #include<iostream>
 3 using namespace std;
 4 typedef struct node
 5 {
 6     int data;
 7     struct node *prior, *next;
 8 }node, *LinkList;
 9 void TwoWayBubbleSort(LinkList &L)
10 //对存储在带头结点的双向链表L中的元素进行双向起泡排序。
11 {
12     int exchange = 1;//设标记
13     LinkList head = L;//双向链表头,算法过程中是向下起泡的开始结点
14     LinkList tail = NULL;//双向链表尾,算法过程中是向上起泡的开始结点
15     while(exchange)
16     {
17         LinkList p = head->next;//p是工作指针,指向当前结点
18         exchange = 0;//假定本趟无交换
19         while (p->next != tail)//向下(右)起泡,一趟有一最大元素沉底
20         {
21             if (p->data > p->next->data)//交换两结点指针,涉及6条链
22             {
23                 LinkList temp = p->next; exchange = 1;//有交换
24                 p->next = temp->next;
25                 if(temp->next)temp->next->prior = p;//先将结点从链表上摘下
26                 //attention!存在temp->next=NULL的可能,NULL->prior无法访问
27                 temp->next = p; p->prior->next = temp;//将temp插到p结点前
28                 temp->prior = p->prior; p->prior = temp;
29                 //p = p->next;
30             }
31             else p = p->next;//无交换,指针后移
32         }
33         tail = p;//准备向上起泡
34         p = tail->prior;
35         while (exchange&&p->prior != head)//向上(左)起泡,一趟有一最小元素冒出
36         {
37
38             if (p->data < p->prior->data)//交换两结点指针,涉及6条链
39             {
40                 LinkList temp = p->prior; exchange = 1;//有交换
41                 p->prior = temp->prior; temp->prior->next = p;
42                 //先将temp结点从链表上摘下
43                 temp->prior = p; p->next->prior = temp;
44                 //将temp插到p结点后(右)
45                 temp->next = p->next; p->next = temp;
46             }
47             else p = p->prior;//无交换,指针前移
48         }
49             head = p;//准备向下起泡
50     }
51 }
52 void Create(LinkList &L, int n)
53 {
54     LinkList p, rear;
55     L = new node;
56     L->next = NULL;
57     L->prior = NULL;
58     rear = L;
59     while (n--)
60     {
61         p = new node;
62         cin>>p->data;
63         p->next = rear->next;
64         rear->next = p;
65         p->prior = rear;
66         rear = p;
67     }
68 }
69 int main()
70 {
71     int n;
72     while (true)
73     {
74         cin >> n;
75         if (!n)break;
76         else
77         {
78             LinkList L;
79             Create(L, n);
80             TwoWayBubbleSort(L);
81             LinkList p = L->next;
82             while (p->next)
83             {
84                 cout << p->data << " ";
85                 p = p->next;
86             }
87             cout << p->data << endl;
88         }
89
90     }
91     return 0;
92 }

转载于:https://www.cnblogs.com/wind-chaser/p/10049548.html

4001.基于双向链表的双向冒泡排序法相关推荐

  1. 4023-基于双向链表的双向冒泡排序法

    描述 有n个记录存储在带头结点的双向链表中,利用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法.(注:双向冒泡排序即相邻两趟排序向相反方向冒泡). 输入 多组数据,每组数据两行.第一行为序列 ...

  2. 【python】双向冒泡排序

    冒泡排序法: 冒泡排序存在所谓的"乌龟问题",假设我们需要将序列按照升序排序. 序列中的较小的数字又大量存在于序列的尾部,这样会让小数字在向前移动得很缓慢, 因此针对这一问题,产生 ...

  3. linux用冒泡排序程序,利用双向走动法改进冒泡排序算法C语言源代码[黑盟核心成员]...

    传统的冒泡排序法是这样操作:从前往后,依次比较两个相邻的元素,如果逆序则交换这两个元素值,然后继续往后操作:到了数据尾部时,就找出了一个最大值(或最小值).然后重复上面的操作n-1次(n为元素个数). ...

  4. 生活中c语言排序案例,C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)...

    C语言之数字排序 在学习C语言的时候遇到了几个比较基础的排序问题,又结合了之前的处理方法.觉得在这个需要再系统地进行复习一下. 当我们在初学C语言的时候,我们都会结合三个数字的排序来理解计算机处理问题 ...

  5. 排序1+1:冒泡排序法(BubbleSort)的改进以及效率比较

    1 我要冒泡 冒泡排序这个名字对于我们来说实在是过于熟悉了.作为一个程序员,如果敢说出自己不会冒泡排序,结局肯定是会被鄙视到火星上去.许多公司到学校去招聘应届毕业生的时候,都会要求写一个冒泡排序.毫无 ...

  6. 冒泡排序法_排序算法 冒泡排序法

    冒泡排序法 基于Java语言实现 本文主要围绕冒泡排序法的标准版和优化版 冒泡排序法简介 原理:冒泡排序法就是对一组数据进行两两比较,也就是说第一个元素和第二个元素进行比较,如果第一个元素大于第二个元 ...

  7. 冒泡排序法定向冒泡排序法的Python实现

    冒泡排序法 冒泡排序法:每轮对相邻的两者进行比较,若顺序不对,则进行位置互换,每轮都将使每轮的 最后一位是该轮的大数. 比如在数列:[71, 1, 14, 78, 75, 38, 10, 49, 40 ...

  8. Simulink仿真:基于DC DC双向变换器的多电池主动均衡技术

    Simulink仿真:基于DC DC双向变换器的多电池主动均衡技术 关键词:锂电池:不一致性:模糊控制理论:DC DC双向主动均衡:荷电状态(SOC):均值-差值法 参考文献:基于DC DC双向变换器 ...

  9. 排序算法系列:冒泡排序与双向冒泡排序

    概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排 ...

最新文章

  1. linux中设置程序开机自动启动
  2. mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句
  3. 30 个 Redis 基础知识
  4. MSIL实用指南-比较运算
  5. python从视频中提取音频_提取视频中的音频——python三行程序搞定!
  6. 网络学习云平台 计算机基础应用,计算机应用基础网络自主学习平台使用说明.doc...
  7. __init和__initdata
  8. 站在2018看单片机和嵌入式芯片方案选型和发展趋势
  9. 视频流调试过程(海康威视+Kurento)
  10. 操作系统:什么是中断?
  11. 语音识别引擎接口 将声音转换为文字显示
  12. CC00034.bigdatajava——|Java方法封装.V16|——|Java.v16|费氏数列.v02|递推实现|
  13. 如何完成计算机的安装程序,如何安装计算机系统程序.doc
  14. JPA二:FindBy和JPQL
  15. 2021年12月中国A股生物制品行业上市企业市值排行榜:百济神州-U位居第二,康希诺-U股价最高(附月榜TOP43详单)
  16. 14.4 手机号码归属地查询
  17. 加粗、倾斜、下划线、删除线标签
  18. 如何翻滚截屏_电脑上如何实现滚动截图?用这款工具即可轻松实现!
  19. BIOS 选项中英文对照
  20. 神州信息承建辽宁“农村产权交易服务平台”获中央农办认可!

热门文章

  1. matlab课程设计图像处理,MATLAB课程设计--GUI图像处理
  2. java 线程类 通信_Java 中利用管道实现线程间的通讯
  3. 中数组的合并_【美团面试题】合并两个有序数组
  4. leetcode15 三数之和
  5. C++(STL):26 ---关联式容器set用法
  6. map类的erase方法的在Linux与Windows中的差异
  7. Qt学习:QDomDocument
  8. 创业成功需早起?看看IT大佬们的作息时间
  9. 45度做人 90度做事 180度为人 360度处事
  10. js 验证用户输入的是否为数字、检查只能为数字