链表的选择插入排序,C版

40 阅读1分钟

复杂度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);
}