单链表排序

单链表排序(升序):

简易法:
/*
	我们对链表进行循环遍历,每次找到最大值放在为排序的最前面。
*/

// 低效率递增排序
void sort(List L){
    int s;
    LNode*p,*q;
    p = L->next;
    while (p != NULL)
    {   
       q = p->next;
       s = p->data;
       while (q != NULL)
       {    
            if(q->data < s){
                s = q->data;
                q->data = p->data; 
                p->data = s;
            }
            q = q->next;
       }
       p = p->next;        
    }   
}
采用插入排序的思想进行排序:
/*
	将链表分成两个部分,左边为已排序,右边为未排序,每次在右边取其中一个元素,到左边进行排序插入。
*/
// 插入排序
void insertSort(List L){
    //1.我们需要将链表分为两段,左边是已经排序好的,而右边是乱序的。
    LNode *p,*q,*r,*pre;
    p = L->next;
    q = p->next;
    p->next = NULL;
    //2.每次取右边的一个元素到左边有序链表中进行插入
    while(q != NULL){
        pre= L;		//pre代表插入位置的前面一个元素
        r = q->next;	// r用来记录未排序子链的头
        while (p!=NULL && p->data<q->data)
        {  // 循环找到需要插入的位置
            p = p->next;
            pre = pre->next;
        }
        
        // 进行插入
        q->next = p;
        pre->next = q;
        q = r;

        //将p指针还原到首元节点处,等待下一次的排序
        p = L->next;
        
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值