单链表排序之冒泡排序

来源:互联网 发布:藏族怎么看中国知乎 编辑:程序博客网 时间:2024/04/28 20:44

***单链表排序之冒泡排序***



/*
前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是
单链表的冒泡排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);

冒泡排序的思想和冒泡排序数组的方法以及冒泡排序的优化,我都已经在冒泡排序的文章中介绍了;

冒泡排序链接:http://blog.csdn.net/bitboss/article/details/51559034

以下着重介绍冒泡排序在单链表中的复用;

// 先来说个挺搞笑的事,我第一次写冒泡排序单链表居然写成了选择排序,我都给蒙圈了;然后一直在想为什么会这样,钻牛角尖了,然后再重新写冒泡排序的时候一直写不出来,陷入了一个误区,一直不能确定内层循环跳出的件,冒泡排序依次后将最后一个抛弃,内层循环一次抛弃一个,知道结束;最后还是参考了同学的代码才将我自己跳出来!

//思路解析: 根据冒泡排序的基本思想,那我们先设置两个节点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 ;}

解释的不好,但还是希望可以帮助到你!


1 1