单链表排序----(快排+归并+插入)
2018-03-22 15:42
344 查看
public static void quicksort(Node begin,Node end){ if(begin!=end){ Node partition=getpartition(begin,end); quicksort(begin,partition); quicksort(partition.next,end); } } public static Node getpartition(Node begin,Node end){ int val=begin.val; Node p=begin; Node q=p.next; int temp; while(q!=end){ if(q.val<val){ p=p.next; temp=p.val; p.val=q.val; q.val=temp; } q=q.next; } begin.val=p.val; p.val=val; return p; }以上为快排,不要想的太复杂
////////////////////////////////////////////////////
归并:leetcode上有public ListNode findmid(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null&&fast.next.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode merge(ListNode l1,ListNode l2){
if(l1==null) return l2;
if(l2==null) return l1;
ListNode start = l1;
ListNode end = l2;
ListNode head = new ListNode(0);
ListNode res = head;
while(start!=null&&end!=null){
if(start.val<end.val){
head.next = start;
start = start.next;
head = head.next;
}else {
head.next = end;
end = end.next;
head = head.next;
}
}
if(start!=null) head.next = start;
if(end!=null) head.next = end;
return res.next;
}
public ListNode sortList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode mid = findmid(head);
ListNode right = new ListNode(0);
right = sortList(mid.next);
mid.next = null; //断开,笔记上有详细注释
ListNode left = sortList(head);
return merge(left,right);
}//////////////////////////////////////////
插入排序:LeetCode有 public ListNode insertionSortList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode root = new ListNode(Integer.MIN_VALUE);
root.next = head;
ListNode cur = head;
ListNode temp;
ListNode pre;
while(cur.next != null && cur != null){
if(cur.val <= cur.next.val)
cur = cur.next;
else{
temp = cur.next;
cur.next = temp.next;
pre = root;
while(pre.next.val <= temp.val){
pre = pre.next;
}
temp.next = pre.next;
pre.next = temp;
}
}
return root.next;
}
相关文章推荐
- Coding interview : 链表排序(选择,插入,快排,归并)
- 链表之排序(插入、选择、归并、快速、冒泡)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、插入、归并和快排)
- 链表排序(冒泡、选择、插入、快排、归并)
- LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)
- 数据结构 29 排序 自己实现 插入排序 插入和归并综合排序 给链表排序
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)【转载】
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表实现归并(快速、插入)排序
- 单链表排序(插入与归并)
- 链表插入排序
- Lintcode 173.链表插入排序
- 作业10.173:链表插入排序
- (C语言)链表排序 --- 插入排序
- LintCode(E) 链表插入排序
- [C++]Merge Two Sorted Lists 归并两个排序的链表
- 对链表数据进行插入排序