链表:快速排序
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;
}
快速排序:
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;
}
相关文章推荐
- 单链表快速排序
- 单链表 快速排序
- 快速排序-单链表
- leetcode之链表类之链表排序-----147/148. 链表快速排序 链表插入排序
- 单链表快速排序
- 链表快速排序终极版
- 单链表快速排序
- 快速排序链表
- {希尔排序、快速排序、动态数组、单链表、字符串转整型}大综合
- 链表快速排序
- 单链表的排序 快速排序 归并排序 quicksort mergesort
- 链表快速排序
- C语言使用链表的插入排序、选择排序、快速排序
- 单向链表排序:快速排序和归并排序
- C++ 单链表快速排序
- 单链表快速排序
- 曾经遇到的一个面试题,快速排序用链表实现,算法和以前的相似,需要注意一些细节处理
- 链表之排序(插入、选择、归并、快速、冒泡)
- 单链表快速排序
- 单链表排序(快速排序、归并排序)