链表快排

###QuickSort on Singly Linked List

#####Rationale

思路和数据的快速排序一样,都需要找到一个pivot元素、或者节点。然后将数组或者单向链表划分为两个部分,然后递归分别快排。
针对数组进行快排的时候,交换交换不同位置的数值,在分而治之完成之后,数据就是排序好的。那么单向链表是什么样的情况呢?除了交换节点值之外,是否有其他更好的方法呢?可以修改指针,不进行数值交换。这可以获取更高的效率。
在修改指针的过程中,会产生新的头指针以及尾指针,要记录下来。在partition之后,要将小于pivot的的部分、pivot、以及大于pivot的部分重新串起来成为一个singly linked list。


// choose the last node as the pivot
    public ListNode quickSortRecur(ListNode head, ListNode tail) {
        
    	if (head == tail) return head;
    	
    	ListNode pivot = tail, cur = head, pre = null, newhead = null;
    	
    	while(pivot != cur) {
    		if(cur.val < pivot.val) {
    			if (null == newhead) newhead = cur;
    			pre = cur;
    			cur = cur.next;
    		} else {
    			
    			tail.next = cur;
    			tail = tail.next;
    			ListNode tmp = cur.next;
    			cur.next = null;
    			cur = tmp;
    			if (null != pre) {
    				pre.next = cur;
    			}
    		}
    	}
    	if (pre != null) {
    		newhead = quickSortRecur(newhead, pre);
    		ListNode tmp = newhead;
    		while(pivot != tmp.next) tmp = tmp.next;
    		tmp.next = pivot;
    	}else {
    		newhead = pivot;
    	}
    	if (pivot != tail)
    		pivot.next = quickSortRecur(pivot.next, tail);
    	return newhead;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值