门户 网站开发周期,在线设计房屋布局软件,免费1级做爰片打网站,小型企业建站公司链表排序#xff0c;可以插入排序#xff0c;我就不写了。
实现归并排序
归并排序#xff08;MERGE-SORT#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法#xff08;Divide and Conquer#xff09;的一个非常典型的应用。将已有序的子序列合并可以插入排序我就不写了。
实现归并排序
归并排序MERGE-SORT是建立在归并操作上的一种有效的排序算法,该算法是采用分治法Divide and Conquer的一个非常典型的应用。将已有序的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。若将两个有序表合并成一个有序表称为二路归并。 归并操作的工作原理如下
第一步申请空间使其大小为两个已经排序序列之和该空间用来存放合并后的序列
第二步设定两个指针最初位置分别为两个已经排序序列的起始位置
第三步比较两个指针所指向的元素选择相对小的元素放入到合并空间并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
数组排序参考
https://blog.csdn.net/hebtu666/article/details/81434236
快慢指针快的一次动两个慢的一次一个当快的到最后慢的一定在中间。
自己手动模拟吧
/*考点1. 快慢指针2. 归并排序。复杂度分析:T(n) 拆分 n/2, 归并 n/2 一共是n/2 n/2 n/ \ 以下依此类推T(n/2) T(n/2) 一共是 n/2*2 n/ \ / \T(n/4) ........... 一共是 n/4*4 n一共有logn层故复杂度是 O(nlogn)*/
class Solution {
public:ListNode *sortList(ListNode *head) {if (!head || !head-next) return head;ListNode* p head, *q head-next;while(q q-next) //快慢指针{p p-next;q q-next-next;}ListNode* left sortList(p-next);//左右重复p-next NULL;ListNode* right sortList(head);return merge(left, right);}ListNode *merge(ListNode *left, ListNode *right) {ListNode dummy(0);ListNode *p dummy;while(left right) {if(left-val right-val) //小的放进来指针向后{p-next left;left left-next;}else {p-next right;right right-next;}p p-next;}if (left) p-next left;//剩下的if (right) p-next right;return dummy.next;}
};