插入排序

对链表进行插入排序,是最简单的一种链表排序算法,用于插入排序是迭代的,所以每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
       每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。
       插入排序的时间复杂度为O(N^2),空间复杂度为O(1)

class Solution {public ListNode insertionSortList(ListNode head) {ListNode move=head;ListNode emptyHead=new ListNode();emptyHead.next=head;while(move!=null&&move.next!=null){if(!reInsert(move,emptyHead)) move=move.next;}return emptyHead.next;}private Boolean reInsert(ListNode node,ListNode emptyHead){ListNode temp=node.next;node.next=temp.next;while(emptyHead!= node){if(temp.val<=emptyHead.next.val){temp.next=emptyHead.next;emptyHead.next=temp;return true;}emptyHead=emptyHead.next;}temp.next=node.next;node.next=temp;return false;}
}

归并排序

对于归并排序排序在数组排序中的运用,详细请点击此处。这里主要介绍归并排序在链表排序中的运用。
       在使用归并排序算法进行链表排序时,其基本思想是将链表细分成一个个子链表,将子链表进行排序,然后再将相邻的两个有序子链表进行合并,得到更长的有序链表,最后一步步得到整个有序链表,子链表进行合并排序时需要用到合并两个有序链表算法。
       归并链表排序的实现方式一共有两种,递归实现和非递归实现,两种实现方式的时间复杂度都是O(nlogn),但是由于递归实现调用函数时需要消耗大量栈空间,所以递归调用的空间复杂度是O(logn)。对于非递归调用,空间复杂度就是O(1)。

递归代码:

class Solution {public ListNode sortList(ListNode head) {if(head==null)return head;return mergeSort(head);}public ListNode mergeSort(ListNode head){if(head.next==null)return head;ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){fast=fast.next.next;if(fast!=null)slow=slow.next;}ListNode tempHead=slow.next;slow.next=null;ListNode left=mergeSort(head);ListNode right=mergeSort(tempHead);head=mergeList(left,right);return head;}public ListNode mergeList(ListNode head,ListNode tempHead){ListNode emptyHead=new ListNode(0,head);ListNode move=emptyHead;while(head!=null&&tempHead!=null){if(head.val<= tempHead.val){move.next=head;head=head.next;}else{move.next=tempHead;tempHead=tempHead.next;}move=move.next;}move.next=head==null?tempHead:head;return emptyHead.next;}
}

非递归代码:

class Solution {public ListNode sortList(ListNode head) {if(head==null)return null;ListNode end=head;int length=0;while(end!=null){length++;end=end.next;}ListNode emptyHead = new ListNode(0, head);for(int i=1;i<length;i<<=1){ListNode prev = emptyHead;ListNode cur = emptyHead.next;while(cur!=null) {ListNode start1 =cur;for (int j = 1; j < i&&cur.next!=null; j++) {cur = cur.next;}ListNode start2 = cur.next;cur.next = null;cur = start2;for (int j = 1; j < i && cur != null&&cur.next!=null; j++) {cur = cur.next;}if(cur!=null){ListNode temp=cur;cur=cur.next;temp.next=null;}prev.next = mergeList(start1, start2);while(prev.next!=null){prev=prev.next;}}}return emptyHead.next;}public ListNode mergeList(ListNode head,ListNode tempHead){ListNode emptyHead=new ListNode(0,head);ListNode move=emptyHead;while(head!=null&&tempHead!=null){if(head.val<= tempHead.val){move.next=head;head=head.next;}else{move.next=tempHead;tempHead=tempHead.next;}move=move.next;}move.next=head==null?tempHead:head;return emptyHead.next;}
}

链表排序算法(Java实现)相关推荐

  1. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  2. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

  3. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  4. 排序算法java源代码_排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

  5. java基础排序_Java排序算法-Java入门|Java基础课程

    1. 课程目标排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2 ...

  6. java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  7. 八大排序算法Java

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  8. 常用排序算法-----------JAVA实现

    #常用排序算法-插入排序,选择排序,交换排序,归并排序,基数排序 ###排序算法可归类为以下几类: 插入排序: 直接插入排序(DirectInsertSort): 二分法排序(BinarySort): ...

  9. 排序算法 -- Java

    排序算法 冒泡排序 选择排序 反转排序 冒泡排序 算法思想:从前往后逐步对比每个相邻元素值,满足条件则交换. 实现细节:双层循环,外层循环是排序轮数-(数组长度-1),内层循环负责对比和交换次数-(数 ...

最新文章

  1. C#初学——doWhile
  2. mysql sqlstate 28000_mysql ERROR 1045 (28000): 错误解决办法
  3. PostGIS_导入shp格式的数据
  4. WPF一步一脚印系列(1):万事起头难
  5. C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介
  6. 分布式事务架构设计原理
  7. 服务器证书在注册表上位置,服务器ssl证书注册表
  8. 让你受益终生的9种思维
  9. Redis监控利器---Redis State
  10. linux用c++获取mac地址,网卡地址,网口地址,网卡序号ip地址,不使用 ioctl(sock, SIOCGIFCONF, ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取
  11. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
  12. Egyptian Collegiate Programming Contest (ECPC 2015)
  13. javaweb图片加载不出来问题的解决方法
  14. Java线程状态中BLOCKED和WAITING有什么区别?
  15. 【绿盟】检测到目标Strict-Transport-Security响应头缺失
  16. 【包运行】Java 实现图形界面的邮件轰炸机附带视频指导教程
  17. CMAKE_INSTALL_PREFIX
  18. Ubuntu 微信 linux版最新可用——UOS魔改版
  19. 鼠标每隔几秒失去焦点,鼠标每隔几秒转圈,鼠标每隔几秒刷新
  20. 加缪——人生到底有什么意义?生命的意义就是生命本身

热门文章

  1. SIKI学习——坦克大战03
  2. C语言基本数据类型简介
  3. 在webpack中使用vue的准备
  4. linux path 打补丁,Linux停patch打补丁命令
  5. 【机器学习】准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure
  6. mysql查看版本的方法
  7. 2014年:Linux和开源的福祸之年
  8. Arduino ESP32 获取网络数据(HTTP POST方式)
  9. Progressive Tree-Based Compression of Large-Scale Particle Data | 学习笔记
  10. html 文字,图片 满屏 滚动代码