两个思路:
快速排序(逻辑是自顶向下)。先划分排序(一次确定一个位置),再对左边右边分别排序,一直到最小粒度;
归并排序(逻辑自下而上) 先一直到最小粒度,然后两两合并排序,最合合成排序好的链表;
1,快速排序
1)根据划分位置将链表 分成两部分(左边小于,右边大于),递归:QuickSort(head,end),时间复杂度logn
void QuickSort(ListNode *head ,ListNode *end){
if (head!=end){
ListNode *pivot=Getpartion(head , end);
QuickSort(head,pivot);
QuickSort(pivot->next,end);
}
}
调用 QuickSort(head, NULL) 呼应后面的j!=end,方便处理最后一个节点
2)得到划分的位置:Getpartion(head,end),这里取第一个节点作为默认的划分节点,划分之后,右边全小于该节点,左边全大于该节点,时间复杂度o(n)