优化版:
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->pNextNode;}pPreNode = pPreNode->pNextNode;}}}
}