您的位置:首页 > 其它

链表:快速排序

2018-03-10 14:29 183 查看
使用快速排序法对链表进行排序。
快速排序:
1、从数列中挑出一个元素,称为 "基准",
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
3、递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

理论上取“中值”为基准算法的时间复杂度会比较低,但实际上并无法判断哪个元素为“中值”,所以直接取第一个元素为基准。
public ListNode sortList(ListNode head) {
if(head == null || head.next == null){    //当只有一个元素时返回,结束递归
return head;
}
ListNode middle = head;
ListNode curr = head.next;
ListNode left = new ListNode(0);
ListNode right = new ListNode(0);
ListNode leftTail = left;
ListNode rightTail = right;
while(curr != null){    //把元素按照大小分配到左右两个链表中
if(curr.val < middle.val){
leftTail.next = curr;
leftTail = curr;
}
else{
rightTail.next = curr;
rightTail = curr;
}
curr = curr.next;
}
leftTail.next = null;    //注意要加上结束符
rightTail.next = null;
left.next = sortList(left.next);    //对left进行递归
right.next = sortList(right.next);    //对right进行递归
leftTail = left;    //排序后续重新寻找链表尾,便于后面三部分的组合
while(leftTail.next != null){    
leftTail = leftTail.next;
}
leftTail.next = middle;
middle.next = right.next;
return left.next;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: