冒泡排序在单链表中的使用详解
2017-04-21 16:28
197 查看
冒泡排序是一种基础而又简单的排序方法,它能够很好地锻炼新手思维能力,同样地,在链表的冒泡排序中,它能够锻炼我们链表的熟悉使用和对链表数据的处理方法。
在对单链表进行冒泡排序之前,我们得先掌握三个基础知识。
●冒泡排序
冒泡排序的基本方法是通过两两比较,每一趟比较中都会把一个较大的数往后移。
例如:一组数:5,4,3,2,1
从小到大排序
第一趟比较中:先对第一个数5和4对比,然后5>4,那么数据交换,然后对第二个数5对第三个数3进行对比,5>3,数据交换,一直这样对比下去,直到这组数据中
5移到了最后一位,即这组数变为:4,3,2,1,5;
然后我们在重复第一趟的步骤,依次比较,然后就把4移到了5的前面;变成3,2,1,4,5;
依次重复(5-1)次
....................
最后变为了:1,2,3,4,5;
循环分析:对于i个数,我们要进行(i-1)趟比较,然后每一趟循环中,我们实际只需要进行(j-i-1)次比较,因为我们第一趟把5移到最后,我们知道了5是这组数据中的
最大值,然后第二趟循环中我们就不用和5进行比较,依次类推下去。
具体的代码不是本文的重点,网上有很多相关的案例,可以去搜搜。
●链表节点的交换
冒泡排序的过程,实际上也是交换的过程,只不过在链表中我们交换的不是数据而是节点,虽然同样可以通过交换数据的方式达到冒泡的结果,但如果节点中的数据非
常多时,效率就会变得非常低,况且这种实现方式并不能带给我们知识上的帮助。所以我们来看看链表节点的交换。
当然,这个函数并没有包含输入尾节点时的交换,因为我们每一次比较的时候都是和下一个数进行对比,当我们输入倒数第二个数的时候就已经和最后一个数进行对
比交换了。如果链表不熟悉的话,建议大家画图分析。
●冒泡排序在链表中的实现
其实如果懂得上面两种知识之后,就可以很容易实现了,我们只需要获取了数据的总数量之后,然后在循环中进行节点的数据的判断并进行交换即可,实现方法如下:
如果有疑问或者意见欢迎大家留言提出,表诉可能不太好,望谅解。
在对单链表进行冒泡排序之前,我们得先掌握三个基础知识。
●冒泡排序
冒泡排序的基本方法是通过两两比较,每一趟比较中都会把一个较大的数往后移。
例如:一组数:5,4,3,2,1
从小到大排序
第一趟比较中:先对第一个数5和4对比,然后5>4,那么数据交换,然后对第二个数5对第三个数3进行对比,5>3,数据交换,一直这样对比下去,直到这组数据中
5移到了最后一位,即这组数变为:4,3,2,1,5;
然后我们在重复第一趟的步骤,依次比较,然后就把4移到了5的前面;变成3,2,1,4,5;
依次重复(5-1)次
....................
最后变为了:1,2,3,4,5;
循环分析:对于i个数,我们要进行(i-1)趟比较,然后每一趟循环中,我们实际只需要进行(j-i-1)次比较,因为我们第一趟把5移到最后,我们知道了5是这组数据中的
最大值,然后第二趟循环中我们就不用和5进行比较,依次类推下去。
具体的代码不是本文的重点,网上有很多相关的案例,可以去搜搜。
●链表节点的交换
冒泡排序的过程,实际上也是交换的过程,只不过在链表中我们交换的不是数据而是节点,虽然同样可以通过交换数据的方式达到冒泡的结果,但如果节点中的数据非
常多时,效率就会变得非常低,况且这种实现方式并不能带给我们知识上的帮助。所以我们来看看链表节点的交换。
NODE* swap(NODE* head){ NODE *p,*q; int data; scanf("%d",&data); p=q=head; while(p->next!=NULL){ if(p->data==data){ if(p==head)head=p->next; //头指针变为下一个节点 else q->next=p->next; //(1) q=q->next;//(2) p->next=q->next;//(3) q->next=p; break; } q=p; //q指针在p指针前面 p=p->next; //p指针后移 } return head; }具体的链表交换图如下:
当然,这个函数并没有包含输入尾节点时的交换,因为我们每一次比较的时候都是和下一个数进行对比,当我们输入倒数第二个数的时候就已经和最后一个数进行对
比交换了。如果链表不熟悉的话,建议大家画图分析。
●冒泡排序在链表中的实现
其实如果懂得上面两种知识之后,就可以很容易实现了,我们只需要获取了数据的总数量之后,然后在循环中进行节点的数据的判断并进行交换即可,实现方法如下:
NODE* maopao(NODE* head){ NODE *p,*q; int num=0,j=0; q=head; //获取链表的长度 while(q!=NULL){ q=q->next; num++; } //冒泡排序的基本思路 for(int i=0;i<num-1;i++) { p=q=head; j=num-i-1; //减少每一趟循环中两两比较的次数 while(p->next!=NULL&&j!=0){ j--; if(p->data>p->next->data){ //节点的交换 if(p==head) head=p->next; else q->next=p->next; q->next=p->next; q=q->next; p->next=q->next; q->next=p; //执行完上面的过程后,为了能够让p顺利地执行移动到交换后的下一位 . p=q; } q=p; //为了能让q保持在p的前面 p=p->next; //p指针后移,即p变成了在q的前面 } } return head; }
如果有疑问或者意见欢迎大家留言提出,表诉可能不太好,望谅解。
相关文章推荐
- [C++]Shared_ptr使用详解&&实现链表
- 使用链表的方法进行冒泡排序
- c语言关于使用链表排序(选择排序、冒泡排序)
- 正则表达式使用详解(二)
- JCoverage使用详解
- VB自动登陆网络站点详解(二):Inet控件与WebBrowser控件配合使用
- showModalDialog()、showModelessDialog()方法使用详解
- Ghost 使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- CheckStyle使用详解
- 正则表达式使用详解
- showModalDialog(),showModelessDialog()使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- 单向链表操作详解(一)
- Window 消息大全使用详解
- [导入]showModalDialog()、showModelessDialog()方法使用详解
- VC常用数据类型使用转换详解
- C语言使用openSSL库DES模块实现加密功能详解
- JDom使用详解
- VC常用数据类型使用转换详解(ZZ)