单链表的选择排序

单链表的选择排序

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),而且同样是不稳定排序,所以单向链表的选择排序算法总体表现也是比较差强人意的。

全部评论
过不了放上来干嘛呀
1 回复 分享
发布于 2020-10-21 21:15
菜鸡想问用dummy存放结果,那么空间复杂度不就是O(n)吗?基础不稳,希望大佬指点
点赞 回复 分享
发布于 2020-11-16 12:00
代码不错,值得学习!不过好像不是严格的选择排序。并没有交换操作
点赞 回复 分享
发布于 2020-10-24 22:30

相关推荐

不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
牛客92804383...:在他心里你已经是他的员工了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务