博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4001.基于双向链表的双向冒泡排序法
阅读量:6720 次
发布时间:2019-06-25

本文共 3009 字,大约阅读时间需要 10 分钟。

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

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

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

描述

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

输入

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

输出

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

样例输入1
54 5 3 2 961 3 5 7 9 20
样例输出1
2 3 4 5 91 2 3 5 7 9
1 //双向冒泡,最大沉底,最小冒出 2 #include
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

你可能感兴趣的文章
三台机器实现免秘钥分发
查看>>
基于mongodb+node express的增删查改(CRUD)操作
查看>>
一句代码搞定点击空白处收键盘
查看>>
PHP动态属性和stdclass
查看>>
IBM P570查看配置
查看>>
如何在现有Fabric网络上添加一个Org?
查看>>
负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建
查看>>
Nginx服务监控
查看>>
C++一些标准模板容器简要介绍(2)
查看>>
博客测试
查看>>
dovecot并发数造成foxmail、outlook等客户端工具接收邮件有时候报错
查看>>
进程管理工具的使用
查看>>
mybatis第三天 小结
查看>>
phoneGap插件开发-多参数和返回值
查看>>
检测Gps和网络定位权限
查看>>
maven中使用springboot返回jsp和json数据
查看>>
GRASP设计模式
查看>>
利用ISA发布Outlook Anywhere邮件客户端
查看>>
IDEA Maven 中添加 Jetty插件
查看>>
双向循环链表
查看>>