歸併排序思路:
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 排列這些節點使遍歷鍊錶按照順序出現...