美文网首页
单链表实现直接插入排序(JAVA)

单链表实现直接插入排序(JAVA)

作者: Bamboooooo_Yoo | 来源:发表于2018-08-05 15:04 被阅读0次

            去面试问了单链表实现快排的问题,所以想来把八大排序算法的单链表实现总结一下。 这篇就先总结直接插入排序。
            实际上,算法就是把原来的单向链表断开,变成前面的有序链表,和后面的待排序链表,各用两个指针控制,将待排序链表中的结点,一个个与有序链表中的结点作比较,找到应该插入的位置,执行操作。
            在插入时,要考虑其插入点的特殊性,比如链首和链尾操作的不同。

    public LNode StraightInsertionSorting(LNode l) {
            if (l == null || l.next == null)
                return l;
            LNode pOrder = l;//有序链表中的游动指针,指向当前待比较的结点
            LNode pWait = l.next;//待排序链中的游动指针,指向待排序链表的第一个结点
            LNode pinsertNode;//指向待插入有序链表的结点
            LNode preOrder = pOrder;//指向pOrder的前一个节点,在插入时有用
            pOrder.next = null;//将有序链表和待排序链表断开
            while(pWait != null) {
                //每次比较前,要对四个指针进行初始化
                preOrder = pOrder = l;
                pinsertNode = pWait;
                pWait = pWait.next;
                pinsertNode.next = null;//将待插入节点和链表断开
                while(pOrder!=null) {
                    if(pOrder.val > pinsertNode.val) {
                        if(pOrder == l) {//待插结点的值最小,需插在头部
                            pinsertNode.next = l;
                            l = pinsertNode;
                            break;
                        }
                        else {//待插结点需插入在有序链表中部,用到preOrder指针
                            pinsertNode.next = pOrder;
                            preOrder.next = pinsertNode;
                            break;
                        }
                    }
                    //循环体,在有序链表中寻找比待插结点数值大的结点
                    preOrder = pOrder;
                    pOrder = pOrder.next;
                }
                if(pOrder == null)//待插结点数值最大,需追加在尾部
                    preOrder.next = pinsertNode;
            }
            return l;       
        }
    

    相关文章

      网友评论

          本文标题:单链表实现直接插入排序(JAVA)

          本文链接:https://www.haomeiwen.com/subject/lcybvftx.html