一 链表的快速排序
代码如下:
void swap(ListNode* a,ListNode* b)
{
int tmp = a->value;
a->value = b->value;
b->value = tmp;
}
ListNode* partitonlist(ListNode* begin,ListNode* end)
{
if(begin==NULL||begin->next==NULL)
return begin;
ListNode* p = begin;
ListNode* q = begin->next;
int key = p->value;
while(q!=end)
{
if(q->value<key)
{
p=p->next;
swap(p,q);
}
q=q->next;
}
//swap(begin,p);
return p;
}
void quickSort(ListNode* begin,ListNode* end)
{
if(begin!=end)
{
ListNode* pivot=partitonlist(begin,end);
partitonlist(begin,pivot);
partitonlist(pivot->next,end);
}
}
ListNode* createList(const vector<int> num)
{
ListNode* dummy=new ListNode(INT_FAST64_MIN);
ListNode* p=dummy;
const int n=num.size();
for(unsigned i=0;i<n;++i)
{
ListNode* t=new ListNode(num[i]);
p->next=t;
p=t;
}
return dummy->next;
}
二 链表的归并排序
代码如下:
ListNode* mergeSortedList(ListNode *L1, ListNode *L2)
{
ListNode dummy(-1), *p1 = &dummy, *p2 = L2; //L1的辅助头结点dummy,因为可能在头部插入
dummy.next = L1;
while(p1->next != NULL && p2 != NULL) //停止条件,也包括了判断两个链表是否为空
{
if(p1->next->value >= p2->value)
{
L2 = p2->next;
p2->next = p1->next;
p1->next = p2;
p1 = p2;
p2 = L2;
}
else
{
p1 = p1->next;
}
}
if(p1->next == NULL) //L2可能还有未处理的结点,直接加在L1尾部即可
{
p1->next = p2;
}
return dummy.next;
}
ListNode *listMergeSort(ListNode *head)
{
if(head == NULL || head->next == NULL) //链表为空,或者只有一个结点,直接返回
return head;
ListNode *slow = head, *fast = head;
while(fast->next != NULL && fast->next->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
}
ListNode *leftHead = head, *rightHead = slow->next;
slow->next = NULL; //需要把左半链表的尾结点的next赋空值,所以用一个变量来记录右半链表的头
leftHead = listMergeSort(leftHead);
rightHead = listMergeSort(rightHead);
return mergeSortedList(leftHead, rightHead);
}
三 链表的冒泡排序
代码如下:
void bubbleSort(ListNode* head)//
{
if(head==NULL||head->next==NULL) return;
for(ListNode* p=head;p!=NULL;p=p->next)
{
for(ListNode* q=p->next;q!=NULL;q=q->next)
{
if(p->value>q->value)
{
int x=p->value;
p->value=q->value;
q->value=x;
}
}
}
}
四 链表的选择排序
代码如下:
void selectSort(ListNode* head)//
{
if(head==NULL||head->next==NULL) return;
for(ListNode* p=head;p!=NULL;p=p->next)
{
ListNode* tmp=p;
for(ListNode* q=p->next;q!=NULL;q=q->next)
{
if(tmp->value>q->value)
{
tmp=q;
}
}
if(p!=tmp)
{
int x=p->value;
p->value=tmp->value;
tmp->value=x;
}
}
}