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

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

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))