单链表排序(冒泡排序)(C语言)
生活随笔
收集整理的這篇文章主要介紹了
单链表排序(冒泡排序)(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
優化版:
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;}}} }總結
以上是生活随笔為你收集整理的单链表排序(冒泡排序)(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初识C++之函数重载、重写、重定义的区别
- 下一篇: 微信红包接口 java_【java微信开