<算法>基于三路划分的链表快速排序
来源:互联网 发布:福建天正网络咨询 编辑:程序博客网 时间:2024/05/18 00:51
此算法基于三路划分的快速排序的思想,如果不懂请先看我之前的博客:
http://blog.csdn.net/gpwner/article/details/76039533
但是又不完全和之前将的三路划分完全一样
下面开始进入正题:
首先得到一个链表之后,我们将链表拆分为小于、等于、大于头结点的子链表:
然后再递归调用算法,将小链表和大链表进行排序,最后再将链表连接成一个与原来的链表一样的链表。
递归结束的条件是:
头结点为null或者链表只有一个节点(也就是说只有头结点)
链表节点的定义:
/** * @version 2017/7/30 14:57 */public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}
public class Main { public static void main(String[] args) { Main main = new Main(); ListNode node1 = new ListNode(10); ListNode node2 = new ListNode(5); ListNode node3 = new ListNode(2); ListNode node4 = new ListNode(11); ListNode node5 = new ListNode(2); ListNode node6 = new ListNode(8); ListNode node7 = new ListNode(9); ListNode node8 = new ListNode(7); ListNode node9 = new ListNode(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = node7; node7.next = node8; node8.next = node9; node1 = main.sortList(node1); while (node1 != null) { System.out.print(node1.val + " "); node1 = node1.next; } } public ListNode sortList(ListNode head) { if (head == null || head.next == null) return head; int val = head.val; ListNode smaller = null; ListNode smaller_head = null; ListNode mid = head; ListNode larger = null; ListNode larger_head = null; ListNode iter = head.next; while (iter != null) { //大于头结点 if (iter.val < val) { if (smaller_head == null) { smaller_head = iter; } else { smaller.next = iter; } smaller = iter; //等于头结点 } else if (iter.val == val) { mid.next = iter; mid = iter; //小于头结点 } else { if (larger_head == null) { larger_head = iter; } else { larger.next = iter; } larger = iter; } iter = iter.next; } //将小链表的末端指针置为null if (smaller != null) smaller.next = null; //将大链表的末指针置为null if (larger != null) larger.next = null; mid.next = sortList(larger_head); //可能会出现头结点是最小的节点的情况 if (smaller == null) { return head; } smaller_head = sortList(smaller_head); smaller = smaller_head; while (smaller.next != null) smaller = smaller.next; //将小链表重新连接上 smaller.next = head; return smaller_head; }}
阅读全文
0 0
- <算法>基于三路划分的链表快速排序
- 算法<基于三路划分的快速排序>
- 排序算法之三路划分的快速排序
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- 快速排序的三路划分法
- 算法--Java代码实现快速排序以及三路划分
- 高级排序-快速排序-利用三数据取中划分的快速排序算法
- 快速排序(2)算法改进--小的子文件、三者取中、重复关键字三路划分
- 划分算法(快速排序的根基)
- 数据结构-快速排序-划分算法
- 快速排序里面数组划分的三种方法
- 快速排序的划分算法的总结和思考
- 快速排序(三路划分)解决大量重复元素
- 快速排序及优化(三路划分等)
- Algorithm--让人困惑的快速排序(划分算法)
- Algorithm--让人困惑的快速排序(划分算法) 续
- Anroid中基于TextView+PopWindow自定义下拉框样式,实现多级下拉框级联
- 【区块链】实体经济距离发行ICO还有多远?
- SpringBoot:spring boot 服务配置和部署
- IE下按钮超链接无法跳转
- 如何判断一个整数x是否可以表示成n个连续正整数的和
- <算法>基于三路划分的链表快速排序
- 最小二乘回归树Python实现——统计学习方法第五章课后题
- 圆与多边形求交面积
- Spring + Jta +JDBCTemplate 分布式事物实现方式
- 第一次用CSDN的MarkDown写博客,遇到个奇葩问题!
- 常见类---String类
- iOS开发 数据存储之SQLite3
- Fast.Plans.v10.1.WinALL 1CD(室内设计绘图软件)
- PS方式配置FPGA和在線升級