前导知识
快速排序的思想.
选定一个基准值,每次遍历把基准值放到正确的的位置
交换指针的做法
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