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

前导知识

快速排序的思想.

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

交换指针的做法

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

你可能感兴趣的:(算法)