148. 排序鍊錶
在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。
示例 1:歸併排序輸入: 4->2->1->3
輸出: 1->2->3->4
之前我們寫過乙個歸併排序:leetcode之鍊錶排序-歸併排序
採用分治的思想,先寫出兩個鍊錶的合併,再進行分。。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
pre-
>next=
nullptr
;return
addtwo
(sortlist
(head)
,sortlist
(low));
} listnode*
addtwo
(listnode* l1,listnode* l2)
else}}
;
插入排序
插入排序類似於向量中元素的插入排序:把待排序的結點插入到前面已經排序好的子鍊錶中。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
low-
>next=fast-
>next;
fast-
>next=temp-
>next;
temp-
>next=fast;
fast=low-
>next;
}else
}return dummy-
>next;}}
;
快速排序
注意swap函式的寫法,分割槽是非常有意思的!!
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
listnode*
sortlist
(listnode* head)
void
quicksort
(listnode* head,listnode* tail)
cur = cur-
>next;
}swap
(head, left)
;quicksort
(head, left)
;quicksort
(left-
>next, tail);}
};
鍊錶實現歸併(快速 插入)排序
歸併排序 思路 1 將待排序陣列 鍊錶 取中點並一分為二 2 遞迴地對左半部分進行歸併排序 3 遞迴地對右半部分進行歸併排序 4 將兩個半部分進行合併 merge 得到結果。編寫分為以下三步 1 找到鍊錶中點 快慢指標思路,快指標一次走兩步,慢指標一次走一步,快指標在鍊錶末尾時,慢指標恰好在鍊錶中點...
三種排序演算法 歸併排序 快速排序,堆排序
歸併排序 建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序演算法穩定,陣列需要o n 的...
O lgn 的三種排序,快速排序 歸併排序 堆排序
快速排序 取某個數作為中間數來進行比較,不斷的交換陣列中的兩個數,分成小於中間數和大於中間數的兩個分組,再對分組做快速排序 也就是用遞迴的思想 歸併排序 從中間把陣列分成兩部分,每部分都進行一次歸併排序 遞迴 然後再使用merge把這兩部分已排完序的陣列合併成順序陣列。堆排序 1 保持堆特性 左右兩...