链接:十大经典排序算法(动画演示)
# 冒泡排序
PNode p,q;//PNode 是结构体指针 | |
for (p = head->next; p != NULL; p = p->next) | |
//p 赋值为数据域的第一个元素,遍历一遍 | |
for (q = p->next; q != NULL; q = q->next) | |
// 相当于是将 p 和其后的所有元素比较 | |
if(p->data>q->data)// | |
{ | |
int tp = p->data; p->data = q->data; q->data = tp; } |
# 选择排序
PNode p,q,Min;//PNode 是结构体指针 | |
for (p = head->next; p != NULL; p = p->next) | |
// 假定 p 为所有元素的最小值 | |
for (q = p->next; q != NULL; q = q->next) | |
//p 和其后所有比较,有小于 p 的话交换位置 | |
if(p->data>q->data)// | |
{ | |
Min=q | |
} |
# 快速排序
void QuickSort(linklist *head,linklist * tail) | |
{ | |
// 递归结束条件:当只有 head 与 tail 元素时结束,因为每次我们传进来 mid 其实 mid 已经不用排序,如果只有两个元素而 mid 不需要排序则递归结束 | |
if (head->next==tail) | |
{ | |
return ; | |
} | |
//p 连接的是比 mid 小的值的链表,q 连接是比 mid 大值的链表并且包括 mid | |
listPoint mid=head->next; | |
listPoint p=head; | |
listPoint q=mid; | |
listPoint t=mid->next; | |
int pivot=mid->key; | |
while (t!=tail) | |
{ | |
if (t->key<pivot) | |
{ | |
p=p->next=t; | |
} | |
else | |
{ | |
q=q->next=t; | |
} | |
t=t->next; | |
} | |
//p 链表连接上 q 链表 | |
p->next=mid; | |
q->next=tail;//q 链表尾部指向 NULL | |
QuickSort(head,mid);// 递归调用 QuickSort | |
QuickSort(mid,tail); | |
} |
C 语言链表快速排序
挖个坑... 未完待续...
