当前位置:网站首页 > 区块链基础 > 正文

单向链表排序算法(单向链表归并排序)



 1 import java.util.Iterator;  2 /  3  * 对单向链表的由小到大归并排序  4  * @author evasean www.cnblogs.com/evasean/  5  * @param <T>  6 */  7 public class MergeSortLinkedList <T extends Comparable<T>> implements Iterable<T>{  8 private Node first = null;  9 private Node last = null;  10 private int n;  11 private class Node{  12  T element;  13  Node next;  14  }  15 private boolean less(Comparable v, Comparable w) {  16 return v.compareTo(w) < 0;  17  }  18  @Override  19 public Iterator<T> iterator() {  20 // TODO Auto-generated method stub  21 return new ListIterator();  22  }  23 private class ListIterator implements Iterator<T>{  24 private Node current = first;  25  @Override  26 public boolean hasNext() {  27 // TODO Auto-generated method stub  28 return current != null;  29  }  30  31  @Override  32 public T next() {  33 // TODO Auto-generated method stub  34 T t = current.element;  35 current = current.next;  36 return t;  37  }  38  }  39 public void add(T t){  40 Node node = new Node();  41 node.element = t;  42 node.next = null;  43 if(first == null && last == null){  44 first = node;  45 last = node;  46 }else if(first != null && first == last){  47 first.next = node;  48 last = node;  49 }else{  50 last.next = node;  51 last = node;  52  }  53 n++;  54  }  55  @Override  56 public String toString(){  57 Iterator<T> iter = iterator();  58 String ret = iter.next().toString();  59 while(iter.hasNext()){  60 ret += ", "+ iter.next().toString() ;  61  }  62 return ret;  63  }  64 public void mergeSort(){  65 first = sort(first);  66  }  67  68 private Node sort(Node head){  69 if(head == null || head.next == null) return head;  70 Node slow = head;  71 Node fast = head;  72 //取中间节点  73 while(fast.next != null && fast.next.next != null){  74 slow = slow.next;  75 fast = fast.next.next;  76  }  77 Node left = head;  78 Node right = slow.next;  79 slow.next = null; //将左右链表分开  80 left = sort(left);  81 right = sort(right);  82 return merge(left,right);  83  }  84 private Node merge(Node left, Node right){  85 //System.out.println("left="+left.element+",right="+right.element);  86 Node aux = new Node(); //需要耗费logn的额外空间  87 Node l= left;  88 Node r = right;  89 Node current = aux;  90 while(l != null && r!=null){  91 if(less(r.element,l.element)) {  92 current.next = r;  93 current = current.next;  94 r = r.next;  95  }  96 else {  97 current.next = l;  98 current = current.next;  99 l= l.next; 100  } 101  } 102 if(l!=null) current.next = l; // 如果左侧没遍历完,将其连接至current后 103 else if(r != null) current.next = r; //如果右侧没遍历完,将其连接至current后 104 return aux.next; //返回归并好的链表 105  } 106 public static void main(String[] args){ 107 ShuffleLinkedList<Integer> sll = new ShuffleLinkedList<Integer>(); 108 sll.add(1); 109 sll.add(2); 110 sll.add(11); 111 sll.add(9); 112 sll.add(10); 113 sll.add(4); 114 sll.add(7); 115  System.out.println(sll); 116  sll.mergeSort(); 117  System.out.println(sll); 118  } 119 120 } 
到此这篇单向链表排序算法(单向链表归并排序)的文章就 介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在 编程的领域有一番成就!

版权声明


相关文章:

  • 速排小蚂蚁编辑器怎么粘贴文字(小蚂蚁编辑器怎么复制链接)2025-04-19 21:18:07
  • 单向链表和双向链表图解(单链表和双向链表的区别)2025-04-19 21:18:07
  • a标签打开新窗口,且重新加载页面(a标签在新窗口打开链接添加什么属性)2025-04-19 21:18:07
  • 如何点击图片跳转链接(如何实现点击图片跳转链接)2025-04-19 21:18:07
  • 逆向单向链表(逆向建立单链表算法)2025-04-19 21:18:07
  • 游戏代码网站(游戏代码网站链接)2025-04-19 21:18:07
  • b站视频怎么弄成链接(bilibili视频怎么生成链接)2025-04-19 21:18:07
  • 单向链表在内存中是连续存储的(单向链表在内存中是连续存储的嘛)2025-04-19 21:18:07
  • 怎么点击图片跳转链接(怎么点击图片跳转链接页面)2025-04-19 21:18:07
  • 单向链表是什么(单向链表是否有环的最佳方法)2025-04-19 21:18:07
  • 全屏图片