复杂度O(N)
思想就是从待排序队列中取一个,并与有序队列中的结点进行比较,找到合适插入位置时插入即可。
//链表排序
typedef struct LinkNode{
int val;
LinkNode * next;
};
///选择排序
void sele(LinkNode * head){
LinkNode *res = NULL,*pre1=NULL,*resHead = NULL;
LinkNode *curr = head;
while(curr){
if(resHead){
while(res && curr->val > res -> val){
pre1 = res;
res = res->next;
}
if(pre1){
if(res){
LinkNode * temp = curr->next;
pre1 -> next = curr;
pre1->next->next = res;
curr = temp;
}
else{
pre1->next = curr;
curr = curr->next;
pre1->next->next = NULL;
}
}
else{
LinkNode * temp = resHead;
resHead = curr;
curr = curr->next;
resHead -> next = temp;
}
}
else{
LinkNode * temp = curr->next;
res = curr;
//curr = curr->next;
resHead = res;
res->next = NULL;
curr = temp;
}
res = resHead;
pre1 = NULL;
}
while(resHead){
printf("%d ",resHead->val);
resHead = resHead->next;
}
}
///测试用
int main(){
LinkNode *head = NULL,*p;
for(int i = 0;i < 10;i++){
LinkNode * temp = (LinkNode *)malloc(sizeof(LinkNode));
temp -> val = rand() % 100;
//printf("%d ",temp->val);
temp -> next =NULL;
if(i == 0){
head = temp;
p = head;
}
p->next = temp;
p = p->next;
}
sele(head);
}