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