Java单链表归并排序
来源:互联网 发布:淘宝店铺的装修特色 编辑:程序博客网 时间:2024/05/15 05:00
概念
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。
归并排序基本原理
通过对若干个有序结点序列的归并来实现排序。
所谓归并是指将若干个已排好序的部分合并成一个有序的部分。
单链表实现归并排序
找到中间点拆分链表
//找到中间点,然后分割 public ListNode getMiddle(ListNode head) { if (head == null) { return head; } //快慢指针 ListNode slow, fast; slow = fast = head; while (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; } return slow; }
合并排好序的链表
// 合并排好序的链表 public ListNode merge(ListNode a, ListNode b) { ListNode dummyHead, curr; dummyHead = new ListNode(0); curr = dummyHead; while (a != null && b != null) { if (a.val <= b.val) { curr.next = a; a = a.next; } else { curr.next = b; b = b.next; } curr = curr.next; } curr.next = (a == null) ? b : a; return dummyHead.next; }
单链表的归并排序
//单链表的归并排序 public ListNode merge_sort(ListNode head) { if (head == null || head.next == null) { return head; } //得到链表中间的数 ListNode middle = getMiddle(head); ListNode sHalf = middle.next; //拆分链表 middle.next = null; //递归调用 return merge(merge_sort(head), merge_sort(sHalf)); }
Application.java
public static void main(String[] args) { ListNode head = new ListNode(0); ListNode l1 = new ListNode(2); ListNode l2 = new ListNode(5); ListNode l3 = new ListNode(3); ListNode l4 = new ListNode(8); ListNode l5 = new ListNode(4); ListNode l6 = new ListNode(2); ListNode l7 = new ListNode(1); head.next = l1; l1.next = l2; l2.next = l3; l3.next = l4; l4.next = l5; l5.next = l6; l6.next = l7; l7.next = null; ListNode p = head; while (p.next != null) { System.out.print(p.val); p = p.next; } System.out.print(p.val); System.out.println(); new MergeSort().merge_sort(head); p = head; while (p != null) { System.out.print(p.val); p = p.next; } }
执行效果图
0 0
- Java单链表归并排序
- 单链表归并排序java
- java排序--归并排序
- 排序-归并排序-Java
- 归并排序Java实现
- java归并排序算法
- JAVA归并排序算法
- java归并排序
- java归并排序
- Java实现归并排序
- 归并排序(java)
- 25、JAVA归并排序
- java 归并排序
- java归并排序
- Java归并排序
- 归并排序 java
- Java实现归并排序
- 归并排序Java实现
- JavaScript 之Date 对象操作
- [华为OJ--C++]057-字符串运用-密码截取
- Mysql分区分表
- SSH服务移植到ARM单板
- struts2整合spring
- Java单链表归并排序
- Android应用完全不需要那么多的权限
- 10款强大的开源 Javascript 图表库
- Frameset使用教程
- 推荐算法--协同滤波
- HashMap 提高篇
- WebGL写入光照
- Spring,hibernate,struts经典面试笔试题(含答案)
- css属性选择器[lang|=en]