***单链表排序之冒泡排序***
/*
前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是
单链表的冒泡排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);
单链表的冒泡排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);
冒泡排序的思想和冒泡排序数组的方法以及冒泡排序的优化,我都已经在冒泡排序的文章中介绍了;
以下着重介绍冒泡排序在单链表中的复用;
// 先来说个挺搞笑的事,我第一次写冒泡排序单链表居然写成了选择排序,我都给蒙圈了;然后一直在想为什么会这样,钻牛角尖了,然后再重新写冒泡排序的时候一直写不出来,陷入了一个误区,一直不能确定内层循环跳出的件,冒泡排序依次后将最后一个抛弃,内层循环一次抛弃一个,知道结束;最后还是参考了同学的代码才将我自己跳出来!
//思路解析: 根据冒泡排序的基本思想,那我们先设置两个节点cur 和 teil来控制内外循环; 都初始化为NULL;第一次的时候内层循环肯定得从表头走到表尾;那么我们来比较一次内循环并进行交换;内层循环通过cur来控制,一次向后挪动一个,有同学就说了,cur变了,外层循环怎么控制? 先别急,耐心往下看;
一次内循环之后,按照前面说的是不是该抛弃(注意不是删除,是不去管它)最后一个结点了,那么下次内循环时就不必比较最后一个,那么就得将teil = cur; 而cur现在指向的就是最后一个结点,下一次内循环时 cur->next!=teil 不久不去管最后一个节点了;以此类推;
那最后就是将cur的问题处理了, 那不是很简单,只需要将 cur = pList->pHead;就行了,每次外层循环都是从第一个开始,并且!=teil,而teil每次都会向前挪动一个(因为每次内层循环结束都会抛弃一个,而teil指向上一个节点);外层循环次数每次减少一个;并且外层循环的总次数是总结点-1次;
这不就是冒泡排序了!
下面看代码如何实现;
*/
#include<stdio.h>
#include<assert.h>
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体
typedef struct LinkList
{
LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表
算法实现
void BubbleSort (pLinkList pList)
{
pLinkNode cur = NULL;
pLinkNode teil = NULL;
assert(pList);
cur = pList->pHead ;
while(cur != teil)
{
while(cur->next != teil)
{
if(cur->data > cur->next ->data )
{
DataType tmp = cur->data ;
cur->data = cur->next ->data ;
cur->next ->data = tmp;
}
cur = cur->next ;
}
teil = cur;
cur = pList->pHead ;
}
return ;
}
解释的不好,但还是希望可以帮助到你!