如果我们使用单链接列表或双链表,排序会花费相同的时间吗?
我想对随机数进行排序。
(我知道它在单一/双重链接列表中插入/删除元素方面有很大差异)
但无论我们使用哪种数据结构(Singly / Doubly LinkedList)或我们实施哪种排序技术来对数字进行排序,是否需要几乎相同的时间?
答案 0 :(得分:0)
用于链表的最快排序方法之一只需要使用链表的下一个指针来执行自下而上合并排序的变体,使用指针数组(通常为26到32个指针)到节点,其中array [i]为NULL或指向列表的指针,其中2表示power i节点。下面的示例代码。
如果在排序期间花费时间维护先前的指针,则对双链表进行排序将比排序单个链表慢。如果在排序期间仅使用下一个指针,则时间大致相同,除了较大的节点(因为它们具有先前的指针)消耗更多的缓存空间。在排序之后执行单个传递来设置前一个指针应该比在排序期间保持先前的指针更快。
NODE * MergeLists(NODE *pSrc1, NODE *pSrc2)
{
NODE *pDst = NULL; /* destination head ptr */
NODE **ppDst = &pDst; /* ptr to head or prev->next */
if(pSrc1 == NULL)
return pSrc2;
if(pSrc2 == NULL)
return pSrc1;
while(1){
if(pSrc2->data < pSrc1->data){ /* if src2 < src1 */
*ppDst = pSrc2;
pSrc2 = *(ppDst = &(pSrc2->next));
if(pSrc2 == NULL){
*ppDst = pSrc1;
break;
}
} else { /* src1 <= src2 */
*ppDst = pSrc1;
pSrc1 = *(ppDst = &(pSrc1->next));
if(pSrc1 == NULL){
*ppDst = pSrc2;
break;
}
}
}
return pDst;
}
#define NUMLISTS 32 /* size of aList[] */
NODE * SortList(NODE *pList)
{
NODE * aList[NUMLISTS]; /* array of lists */
NODE * pNode;
NODE * pNext;
int i;
if(pList == NULL) /* check for empty list */
return NULL;
for(i = 0; i < NUMLISTS; i++) /* zero array */
aList[i] = NULL;
pNode = pList; /* merge nodes into array */
while(pNode != NULL){
pNext = pNode->next;
pNode->next = NULL;
for(i = 0; (i < NUMLISTS) && (aList[i] != NULL); i++){
pNode = MergeLists(aList[i], pNode);
aList[i] = NULL;
}
if(i == NUMLISTS)
i--;
aList[i] = pNode;
pNode = pNext;
}
pNode = NULL; /* merge array into one list */
for(i = 0; i < NUMLISTS; i++)
pNode = MergeLists(aList[i], pNode);
return pNode;
}