鍊錶實現歸併(快速 插入)排序

2021-07-11 17:33:12 字數 1857 閱讀 8011

歸併排序

思路:

1)將待排序陣列(鍊錶)取中點並一分為二;

2)遞迴地對左半部分進行歸併排序;

3)遞迴地對右半部分進行歸併排序;

4)將兩個半部分進行合併(merge),得到結果。

**編寫分為以下三步:

1)找到鍊錶中點 (快慢指標思路,快指標一次走兩步,慢指標一次走一步,快指標在鍊錶末尾時,慢指標恰好在鍊錶中點);

2)寫出merge函式,即如何合併鍊錶;

3)寫出mergesort函式,實現上述步驟。

struct listnode 

};/*歸併排序*/

listnode* findmidddlenode(listnode* head)//尋找鍊錶中間節點

return second;

}listnode* mergelists(listnode* l1, listnode* l2)//合併鍊錶

else

head = head -> next;

}if(!l1) head -> next = l2;

if(!l2) head -> next = l1;

return pnode -> next;

delete pnode;

}listnode* sortlist(listnode* head)//歸併排序

快速排序

思路:

1)選取第乙個節點作為樞軸,然後遍歷鍊錶;

2)如果當前元素小於樞軸的元素,則採用頭插法,把該位置的節點插入到鍊錶的首位置,如果當前元素大於樞軸元素,則當前元素向後移動一位;

3)遍歷一遍鍊錶以後,最後樞軸的位置,把鍊錶分割為兩部分,前部分元素小於樞軸元素,後半部分元素大於樞軸元素;

4)分別對前半部分元素和後半部分元素進行快速排序。

**:

struct listnode 

};/*快速排序*/

void partition(listnode* first, listnode* last)//對鍊錶中的元素進行劃分

else

//使大於privot值的元素在privot後邊

cur = cur->next;

}//遞迴快排前半部分

partition(first, privot);

//如果有多個privot的值相同,則取最後乙個pirvot

while (privot->next != last && privot->next->val == privot->val)

privot = privot->next;

//遞迴快排後半部分

if (privot->next != last)

partition(privot, last);

}listnode* sortlist(listnode* head)//快速排序

插入排序

思路:

1)將原鍊錶分為以newhead為頭節點的已排序鍊錶和以head為頭節點的待排序鍊錶,初始時已排序鍊錶為空;

2)順序遍歷待排序鍊錶中的元素,在已排序鍊錶中找到應該插入的位置,並插入;

3)最終待排序鍊錶為空,原鍊錶排序完畢。

**:

struct listnode 

};/*插入排序*/

listnode *insertionsortlist(listnode* head)

return newhead->next;

}

c 實現鍊錶插入排序和歸併排序

最近刷leetcode時遇到了兩道鍊錶排序題,相對陣列排序而言處理上覆雜了一些,卻蠻有意思。有必要記錄一下。leetcode第147題對鍊錶進行插入排序並不複雜,相對於陣列的插入排序來說思路是直接可以用的。首先我們設定乙個dummy頭節點,然後從待排序煉表裡依次拿出節點,放入dummy煉表裡的合適位...

鍊錶的歸併排序,插入排序

來自資料結構與演算法書 進行鍊錶排序並避免建立,刪除新的節點 1.node是結構體模板,linklist是類模板 using namespace std template struct node template class linklist 2 歸併排序 template void linklis...

鍊錶插入排序 鍊錶指標實現

include includetypedef struct node link 鏈結 struct node 節點 int main void t next null 初始化鍊錶為0 999的隨機數,結尾指向null for t a next t null t u 排列這些節點使遍歷鍊錶按照順序出現...