您的位置:首页 > 编程语言 > C语言/C++

单链表排序(冒泡排序)(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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: