1.冒泡排序
思想:
我们设置两个变量cur、teil来控制循环次数,第一次我们遍历整个链表,会找到最大的一个,但是这个不能删除,只是在第二次整体遍历时不去遍历它,那么我们就用teil指针=cur指针,在第一次遍历整个链表时,cur指向了最后一个节点,此时让teil=cur,下次遍历时,cur->next!=teil,依次类推,我们就可以实现冒泡排序链表
typedef int DataType;
typedef struct LinkNode{
struct LinkNode *pNext;
DataType data;
}LinkNode;
typedef struct LinkList{
LinkNode *pHead;
}LinkList;
//排序
void BubbleSort(LinkList **ppFirst)
{
LinkNode *cur = NULL;
LinkNode *teil = NULL;
assert(*ppFirst);
cur = (*ppFirst)->pHead;
while (cur != teil){
while (cur->pNext != teil)
{
if (cur->data > cur->pNext->data)
{
DataType tmp = cur->data;
cur->data = cur->pNext->data;
cur->pNext->data = tmp;
}
cur = cur->pNext;
}
teil = cur;
cur = (*ppFirst)->pHead;
}
return;
}
2.快速排序
思想:
我们将链表的首节点作为基准,定义两个变量p、q,将p指向首节点,q指向p的下一个节点,每次都让q和基准点进行比较,若大于基准点,将q向后走一个,若小于基准点,就让p先指向下一个节点,然后进行交换,最后我们就可以找到p所在的位置就是最后一个比基准值小的结点,进行交换,此时,我们就可以以基准点为分界点,分为两个链表。
void QuickSort(LinkNode *head, LinkNode *tail)
{
if (head == NULL)
return;
if (head == tail)
return;
int data = head->data;
LinkNode *p = head;
LinkNode *q = p->pNext;
while (q != tail){
if (q->data < data){ //每次和基准值进行比较
p = p->pNext;
DataType tmp = p->data;
p->data = q->data;
q->data = tmp;
}
q = q->pNext;
}
DataType tmp = p->data;//此时p指向比基准小的最后一个结点
//交换就可以分为两个链表,一边比基准大,一边比基准小
p->data = head->data;
head->data = tmp;
QuickSort(head,p);//递归排序比基准小的链表
QuickSort(p->pNext,NULL);递归排序比基准大的链表
}