感觉链表的快速排序也挺好写的,甚至比数组更容易理解,但不知道为什么看到很多人都说快排不适合单链表结构的数据。
思想:
- 取第一个元素为哨兵,遍历链表,将小于、等于、大于的元素分成3个子链表;
- 递归整理“小于”链表;
- 递归整理“大于”链表;
- 将3个链表连接起来。
代码实现如下:
//链表快速排序,返回最后一个元素的地址
myNode* quickSortForList(myNode* &head)
{
if(head==nullptr||head->next==nullptr) return head;
//分成小于,等于,大于哨兵的3个链表
auto pivot=head;//取第一个元素为哨兵
auto pt=head;//遍历指针
myNode* ls_head=new myNode;//小于哨兵的链表头,该链表第一个元素无效
myNode* eq_head=head;//等于哨兵的链表头,该链表第一个元素有效
myNode* bg_head=new myNode;//大于哨兵的链表头,该链表第一个元素无效
myNode* ls_pt=ls_head, *eq_pt=eq_head, *bg_pt=bg_head;
while(pt=pt->next)
{
if(pt->val < pivot->val)
{//小于哨兵,加到第一个链表后面
ls_pt->next=pt;
ls_pt=l