4001.基于双向链表的双向冒泡排序法
基于双向链表的双向冒泡排序法
发布时间: 2018年11月26日 10:09 时间限制: 1000ms 内存限制: 128M
习题集源码中出现了 temp->next->prior = p; 本人推断这里缺少预先的对temp->next==NULL这种情况的判定,所以需加入一个判断语句解决。
此为非循环的双向链表,末尾空指针没有前驱,与循环双向链表有所不同。
有n个记录存储在带头结点的双向链表中,利用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)。
多组数据,每组数据两行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数)。当n等于0时,输入结束。
每组数据输出一行,为从小到大排序后的序列。每两个元素之间用空格隔开。
5 4 5 3 2 9 6 1 3 5 7 9 2 0
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.基于双向链表的双向冒泡排序法相关推荐
- 4023-基于双向链表的双向冒泡排序法
描述 有n个记录存储在带头结点的双向链表中,利用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法.(注:双向冒泡排序即相邻两趟排序向相反方向冒泡). 输入 多组数据,每组数据两行.第一行为序列 ...
- 【python】双向冒泡排序
冒泡排序法: 冒泡排序存在所谓的"乌龟问题",假设我们需要将序列按照升序排序. 序列中的较小的数字又大量存在于序列的尾部,这样会让小数字在向前移动得很缓慢, 因此针对这一问题,产生 ...
- linux用冒泡排序程序,利用双向走动法改进冒泡排序算法C语言源代码[黑盟核心成员]...
传统的冒泡排序法是这样操作:从前往后,依次比较两个相邻的元素,如果逆序则交换这两个元素值,然后继续往后操作:到了数据尾部时,就找出了一个最大值(或最小值).然后重复上面的操作n-1次(n为元素个数). ...
- 生活中c语言排序案例,C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)...
C语言之数字排序 在学习C语言的时候遇到了几个比较基础的排序问题,又结合了之前的处理方法.觉得在这个需要再系统地进行复习一下. 当我们在初学C语言的时候,我们都会结合三个数字的排序来理解计算机处理问题 ...
- 排序1+1:冒泡排序法(BubbleSort)的改进以及效率比较
1 我要冒泡 冒泡排序这个名字对于我们来说实在是过于熟悉了.作为一个程序员,如果敢说出自己不会冒泡排序,结局肯定是会被鄙视到火星上去.许多公司到学校去招聘应届毕业生的时候,都会要求写一个冒泡排序.毫无 ...
- 冒泡排序法_排序算法 冒泡排序法
冒泡排序法 基于Java语言实现 本文主要围绕冒泡排序法的标准版和优化版 冒泡排序法简介 原理:冒泡排序法就是对一组数据进行两两比较,也就是说第一个元素和第二个元素进行比较,如果第一个元素大于第二个元 ...
- 冒泡排序法定向冒泡排序法的Python实现
冒泡排序法 冒泡排序法:每轮对相邻的两者进行比较,若顺序不对,则进行位置互换,每轮都将使每轮的 最后一位是该轮的大数. 比如在数列:[71, 1, 14, 78, 75, 38, 10, 49, 40 ...
- Simulink仿真:基于DC DC双向变换器的多电池主动均衡技术
Simulink仿真:基于DC DC双向变换器的多电池主动均衡技术 关键词:锂电池:不一致性:模糊控制理论:DC DC双向主动均衡:荷电状态(SOC):均值-差值法 参考文献:基于DC DC双向变换器 ...
- 排序算法系列:冒泡排序与双向冒泡排序
概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排 ...
最新文章
- linux中设置程序开机自动启动
- mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句
- 30 个 Redis 基础知识
- MSIL实用指南-比较运算
- python从视频中提取音频_提取视频中的音频——python三行程序搞定!
- 网络学习云平台 计算机基础应用,计算机应用基础网络自主学习平台使用说明.doc...
- __init和__initdata
- 站在2018看单片机和嵌入式芯片方案选型和发展趋势
- 视频流调试过程(海康威视+Kurento)
- 操作系统:什么是中断?
- 语音识别引擎接口 将声音转换为文字显示
- CC00034.bigdatajava——|Java方法封装.V16|——|Java.v16|费氏数列.v02|递推实现|
- 如何完成计算机的安装程序,如何安装计算机系统程序.doc
- JPA二:FindBy和JPQL
- 2021年12月中国A股生物制品行业上市企业市值排行榜:百济神州-U位居第二,康希诺-U股价最高(附月榜TOP43详单)
- 14.4	手机号码归属地查询
- 加粗、倾斜、下划线、删除线标签
- 如何翻滚截屏_电脑上如何实现滚动截图?用这款工具即可轻松实现!
- BIOS 选项中英文对照
- 神州信息承建辽宁“农村产权交易服务平台”获中央农办认可!