單鏈表歸併排序

2021-07-11 15:33:27 字數 1750 閱讀 2828

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 ...