链表:快速排序

使用快速排序法对链表进行排序。

快速排序:

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值