单链表的选择排序
单链表的选择排序
http://www.nowcoder.com/questionTerminal/f23604257af94d939848729b1a5cda08
选择排序的大体思路就是先建立已排序区和未排序区(初始状态已排序区为空,未排序区为整个单向链表),循环遍历未排序区找到最小的元素并移动到已排序区的末尾(从未排序区删除)。代码如下:
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * * @param head ListNode类 the head node * @return ListNode类 */ public ListNode sortInList (ListNode head) { if (head == null) { return null; } ListNode dummy = new ListNode(Integer.MIN_VALUE); // 建立哨兵,用于减少一些不必要的非空判断 dummy.next = head; ListNode sortedTail = dummy; // 已排序区的尾端节点,用于往已排序区的尾端添加min节点 while (sortedTail.next != null) { // sortedTail.next指向的是未排序区的头部,sortedTail.next为空表示未排序区已清空,结束循环 ListNode prev = sortedTail; // curr的前一个节点,用于获取minPrev ListNode curr = sortedTail.next; // curr指向未排序区头部节点,准备开始遍历整个未排序区 ListNode minPrev = prev; // min节点的前一个节点,从未排序区删除min节点的时候需要用到 ListNode min = curr; while (curr != null) { if (curr.val < min.val) { minPrev = prev; min = curr; } prev = curr; curr = curr.next; } minPrev.next = min.next; // 从未排序区删除min节点 min.next = sortedTail.next; // 更新未排序区的头部节点,与下面两行代码配合使用 sortedTail.next = min; // 把min节点添加到已排序区尾端 sortedTail = sortedTail.next; // 更新已排序区尾端节点 } return dummy.next; } }
和数组的选择排序一样,最好时间复杂度/最坏时间复杂度/平均时间复杂度均为T(N)=O(N^2),空间复杂度S(N)=O(1),而且同样是不稳定排序,所以单向链表的选择排序算法总体表现也是比较差强人意的。