链表快速排序(三种做法)

前导知识

快速排序的思想.

选定一个基准值,每次遍历把基准值放到正确的的位置

交换指针的做法

ListNode *quick_sort(ListNode *head, ListNode *end) {
    if (head == end) return head;//head和end是同一个节点,或者为末尾的时候
    ListNode ret;
    ret.next = head;//指向头部
    ListNode *x = head->next, *px = head, *z = head, *p;
    //x遍历链表指针,px是x的前一个指针,z基准值指针
    while (x != end) {
        //printf("%d ",x->val);
        if(x->val < z->val) {//找到比基准值小的
            //printf("%d ",x->val);
            //这里建议画图,比较好理解
            x = x->next;//x后移
            p = ret.next;//缓存头节点
            ret.next = px->next;//用头插法,把现在小于基准值的节点插入基准值前面
            px->next->next = p;//小于基准值的值,链接链表
            px->next = x;//px更新
        } else {
            px = x;//指向x
            x = x->next;//x后移
        }
    }
    //printf("%d %d\n ",ret.next->val,z->val);
    ret.next = quick_sort(ret.next,z);//前半段
    z->next = quick_sort(z->next,end);//后半段
    return ret.next;
}

ListNode* linkedListSort(ListNode *head) {
    head = quick_sort(head,NULL);
    return head;
}

交换值的做法

ListNode *quick_sort(ListNode *head, ListNode *end) {
    if (head == end) return head;//head和end是同一个节点,或者为末尾的时候
    int val = head->val;
    ListNode * p = head, *q = head->next;
    while (q != end) {
        if (q->val < val) {
            p->val = q->val;
            p = p->next;
            q->val = p->val;
        }
        q = q->next;
    }
    p->val = val;
    quick_sort(head,p);
    quick_sort(p->next,end);
    return ;
}

ListNode* linkedListSort(ListNode *head) {
    quick_sort(head,NULL);
    return head;
}

基准点和基准值不在一个位置的排序

#define swap(a,b) ({a ^= b; b ^= a; a ^= b;})
ListNode *quick_sort(ListNode *head, ListNode *end) {
    if (head == end) return head;//head和end是同一个节点,或者为末尾的时候
    int val = head->val;
    ListNode * p = head, *q = head->next;
    while (q != end) {
        if (q->val < val) {
            swap(p->val,q->val);
            p = p->next;
        }
        q = q->next;
    }
    if (head == p) {//防止无限循环
        quick_sort(p->next,end);
        return ;
    }
    quick_sort(head,p);
    quick_sort(p,end);
    return ;
}

ListNode* linkedListSort(ListNode *head) {
    quick_sort(head,NULL);
    return head;
}

想看链表其他排序去这里
https://www.cnblogs.com/TenosDoIt/p/3666585.html

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值