【题目】
给定一个无序单链表的头结点head,实现单链表的选择排序。
要求:额外空间复杂度为O(1)
【代码】
//单链表的选择排序,额外空间复杂度O(1),时间复杂度O(N^2)
//思想:从未排序部分找到最小值,然后放到排序部分的尾部,最后结果:小->大
public static Node selectionSort(Node head){
Node tail=null;//排序部分尾部
Node cur=head;//未排序部分头部,只有它有初值!
Node smallPre=null;//最小节点的前一个节点
Node small=null;//最小节点
while(cur!=null){
small=cur;
smallPre=getSmallestPreNode(cur);
if(smallPre!=null){
//如果第一个值就是small,smallPre为null,直接到后面,改变cur
small=smallPre.next;
smallPre.next=small.next;//删除small
}
cur=cur==small?cur.next:cur;
if(tail==null){//第一次找到最小值,该最小值直接作为新链表的head
head=small;
}else{
tail.next=small;//后面找到的是局部最小,添到尾部
}
tail=small;//更新排序部分尾部
}
return head;
}
//找到未排序部分的最小节点前节点
public static Node getSmallestPreNode(Node head){
Node small=head;
Node smallPre=null;
Node pre=head;//遍历过程中,记录当前节点的前节点
Node cur=head.next;
while(cur!=null){
if(cur.value<small.value){//找到比small更小的节点,更新
small=cur;
smallPre=pre;
}
pre=cur;
cur=cur.next;//遍历后面的节点,比较大小
}
return smallPre;
}
3738

被折叠的 条评论
为什么被折叠?



