单链表排序(冒泡排序)(C语言)
2016-04-14 19:53
585 查看
优化版:
最终优化版:
void SortList(PSListNode pHead) { if (NULL == pHead) { return; } else { int flag = 0; PSListNode pTailNode = NULL; //当设置的尾节点与头结点指向同一个节点时,说明只有一个元素为排序,那么冒泡完成 while (pTailNode != pHead) { PSListNode pPreNode = pHead; //每次参与比较的都是尾节点前面的结点 while (pPreNode->pNextNode != pTailNode) { PSListNode pCurNode = pPreNode->pNextNode; if (pPreNode->data > pCurNode->data) { DataType dTemp = pPreNode->data; pPreNode->data = pCurNode->data; pCurNode->data = dTemp; flag = 1; } pPreNode = pPreNode->pNextNode; } //对冒泡的优化,只要有一趟比较没有发生结点交换,说明冒泡完成,就可以退出冒泡的代码块了 if (0 == flag) { break; } pTailNode = pPreNode; } } }
最终优化版:
void SortList(PSListNode pHead) { if (NULL == pHead) { return; } else { PSListNode pTailNode = NULL; PSListNode pFlagNode = NULL; //因为pFlagNode是记录最后一次发生交换的两个节点的前一个结点,理论上如果pFlagNode与pHead相等, //那么就说明链表只是头两个结点是无序的,那么第一次排序完成就不再排序,或者是第二种情况,pFlagNode //被置为pHead,要是第一趟排序完成,pFlagNide仍为pHead,就说明没有发生交换,那么就不再进行排序 while (pFlagNode != pHead) { pTailNode = pFlagNode; pFlagNode = pHead; PSListNode pPreNode = pHead; while (pPreNode->pNextNode != pTailNode) { PSListNode pCurNode = pPreNode->pNextNode; if (pPreNode->data > pCurNode->data) { DataType dTemp = pPreNode->data; pPreNode->data = pCurNode->data; pCurNode->data = dTemp; //记住最后一次发生交换的地方 pFlagNode = pPreNode; } pPreNode = pPreNode->pNextNode; } } } }
相关文章推荐
- leetcode21题 题解 翻译 C语言版 Python版
- c++ json封装---解析
- c++第二次作业
- ActiveX(MFC)控件——添加接口及WEB调用
- C++ string类的实现
- int、long、long long取值范围
- C++创建文件夹
- VC 字符串转化和分割
- C++打印日志功能设计
- C++基本语法-----template
- 逆置/反转单链表(C语言)
- 单链表实现约瑟夫环(JosephCircle)(C语言)
- 在无头单链表的一个非头节点前插入一个节点(C语言)
- c语言前n项求和如何实现?2个方法可行的
- 上周末没事写了一个UDP的例子 大家感兴趣的可以参考一下
- VC 自己封装简单的播放音频MCI类库
- iOS陆哥开发笔记(二十四) (C语言之内存四区和函数调用模型)
- C++11 标准新特性: 右值引用与转移语义
- 深搜-n皇后问题 1019
- 浅谈C++中的几种构造函数