算法1
(快排) $O(nlogn)$
这里只换节点的值,不替换节点本身,其他基本跟传统快排一样。
这里采用两个指针p和q,这两个指针均往next方向移动,移动的过程中保持p之前的key都小于选定的key,p和q之间的key都大于选定的key,那么当q走到末尾的时候便完成了一次partion的过程,然后递归下去即可
C++ 代码
class Solution {
public:
ListNode* quickSortList(ListNode* head) {
if(!head) return head;
quickSort(head, NULL);
return head;
}
void quickSort(ListNode* head, ListNode* tail)
{
if (head != tail)
{
int key = head->val;
ListNode *p = head, *q = p->next;
while(q != tail) {
if(q->val < key) {
p = p->next;
swap(p->val, q->val);
}
q = q->next;
}
if(p != head)
swap(head->val, p->val);
quickSort(head, p);
quickSort(p->next, tail);
}
}
};
quciksort的第二个参数还可以传null吗
为什么要swap(head->val, p->val)呢?
y总不是说快排 左边 <= x <= 右边 这样就行吗
但是我看教科书: 左边 < x <= 右边 按这个定义确实要swap
但是按y总定义应该是不要swap的。
我可以这样理解不? 因为一开始就是next,所以head没比过,丢过去就比过了
这个只是把head到p之间的最大值(head->val)往后放吧?