1、對於鍊錶來說,由於其元素的訪問只能是順序訪問,而快速排序是改進後的氣泡排序,需要隨機訪問資料,不合適。採用歸併排序方式對鍊錶元素進行訪問;
2、需要的步驟
1) 分割:將一段鍊錶分成兩部分
2) 排序:將兩端已經有序的鍊錶合併
3)分治遞迴:遞迴操作
//將鍊錶plist分割,並把分割後的兩段鍊錶第乙個元素節點通過二級指標帶出。其中plist為該鍊錶第乙個元素節點指標
void clinklist::splitlist(clinknode * plist, clinknode **pbegnode1, clinknode **pbegnode2)
clinknode *pfastnode = null;
clinknode *pslownode = plist;
if (pslownode == null || pslownode->pnext == null)
pfastnode = pslownode->pnext;
while (pfastnode != null)
//printf("pslownode[%d], pfastnode[%d]\n", pslownode->elem, pfastnode->elem);
}*pbegnode1 = plist;
*pbegnode2 = pslownode->pnext;
//printf("plist[%d], pslownode[%d]\n", plist->elem, pslownode->elem);
//從中間斷開鍊錶
pslownode->pnext = null; }
//對兩段有序鍊錶進行排序
//通過虛擬節點進行
clinknode * clinklist::sortlist(clinknode * plista, clinknode * plistb)
else if (plistb == null)
while (plista != null && plistb != null)
else
}if (plista != null)
else if (plistb != null)
return ctmpnode.pnext;}
//通過遞迴方式合併兩個鍊錶
clinknode * clinklist::sortlist1(clinknode * plista, clinknode * plistb)
else if (plistb == null)
//if (plista->elem <= plistb->elem)
else
return presult;}
//分治遞迴
//引數為out引數
void clinklist::mergeslist(clinknode ** plistnode)
clinknode *pfrontnode = null;
clinknode *pbacknode = null;
//鍊錶分割,因為不能隨機訪問
splitlist(*plistnode , &pfrontnode, &pbacknode);
//遞迴呼叫,遞迴到沒有節點時退出
mergeslist(&pfrontnode);
mergeslist(&pbacknode);
//兩個鍊錶排序
*plistnode = sortlist1(pfrontnode, pbacknode);
}
Java單鏈表歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。找到中間點,然後分割 publi...
單鏈表歸併排序java
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。找到中間點,然後分割 publi...
單鏈表的歸併排序
題目 單鏈表的歸併排序 思路 首先找到鍊錶的中間節點,將原始鍊錶一分為二,遞迴進行該操作,直到被劃分的兩個鍊錶包含的節點少於等於1個,即該次劃分後兩個鍊錶已經有序。然後依次合併兩個有序的鍊錶,直到所有劃分都合併完,即排序完畢。主要編寫將兩個有序鍊錶合併為乙個有序鍊錶的函式。includeusing ...