冒泡排序:
#include <stdio.h>
typedef struct linknode
{
int value;
struct linknode* next;
} LinkNode;
LinkNode* BubbleSort1(LinkNode* link)
{
int n = 0;
LinkNode* p = link;
while (p)
{
n++;
p = p->next;
}
for (int i = 0; i <= n; i++)
{
LinkNode* prev = NULL;
LinkNode* cur = link;
int k = 0;
int j = 0;
while (cur && cur->next && j <= n - i)
{
if (cur->value > cur->next->value)
{
LinkNode* temp = cur->next;
if (prev)
prev->next = temp;
else
{
link = temp;
}
prev = temp;
cur->next = temp->next;
temp->next = cur;
k = 0;
}
else
{
prev = cur;
cur = cur->next;
k++;
}
j++;
}
i += k;
}
return link;
}
LinkNode* BubbleSort2(LinkNode* link)
{
LinkNode* endNode = NULL;
LinkNode* lastEndNode = NULL;
while (endNode != link)
{
LinkNode* prev = NULL;
LinkNode* cur = link;
endNode = link;
while (cur && cur->next && cur->next != lastEndNode)
{
if (cur->next->value < cur->value)
{
if (prev)
prev->next = cur->next;
else
link = cur->next;
prev = cur->next;
LinkNode* temp = cur->next->next;
cur->next->next = cur;
cur->next = temp;
endNode = cur;
}
else
{
prev = cur;
cur = cur->next;
}
}
lastEndNode = endNode;
}
return link;
}
LinkNode* CreateLinkInc(int beg, int end, int step)
{
LinkNode* head = NULL;
LinkNode* tail = NULL;
for (int i = beg; i < end ; i += step)
{
LinkNode* p = new LinkNode;
p->value = i;
p->next = NULL;
if (!head)
{
head = p;
tail = head;
}
else
{
tail->next = p;
tail = p;
}
}
return head;
}
LinkNode* CreateLinkDesc(int beg, int end, int step)
{
LinkNode* head = NULL;
LinkNode* tail = NULL;
for (int i = beg; i > end; i -= step)
{
LinkNode* p = new LinkNode;
p->value = i;
p->next = NULL;
if (!head)
{
head = p;
tail = head;
}
else
{
tail->next = p;
tail = p;
}
}
return head;
}
LinkNode* ContactLink(LinkNode* link1, LinkNode* link2)
{
LinkNode* head = link1;
LinkNode* p = link1;
while (true)
{
if (p->next)
p = p->next;
else
break;
}
p->next = link2;
return head;
}
//測試用例
int main(int argc, char** argv)
{
LinkNode* link = ContactLink(CreateLinkInc(1, 10, 2), CreateLinkDesc(200, 150, 5));
link = ContactLink(CreateLinkDesc(1000, 100, 100), link);
printf("Before Bubble Sort:\n");
LinkNode* p = link;
while (p)
{
printf("%d ", p->value);
p = p->next;
}
printf("\nAfter Bubble Sort:\n");
link = BubbleSort1(link);
//link = BubbleSort2(link);
p = link;
while (p)
{
printf("%d ", p->value);
p = p->next;
}
getchar();
return 0;
}
快速排序:
#include <stdio.h>
typedef struct linknode
{
int value;
struct linknode* next;
} LinkNode;
//快速排序解法一:
LinkNode* QuickSort(LinkNode* link, LinkNode* prev, LinkNode* end)
{
if (link == end || NULL == link)
return link;
LinkNode* node = link;
LinkNode* node_i = link;
LinkNode* prev_i = NULL;
LinkNode* node_j = link->next;
LinkNode* prev_j = link;
while (node_j != end)
{
if (node_j->value >= node->value)
{
prev_j = node_j;
node_j = node_j->next;
}
else
{
prev_i = node_i;
node_i = node_i->next;
if (node_i == node_j)
{
prev_j = node_j;
node_j = node_j->next;
}
else
{
if (prev_i)
prev_i->next = node_j;
if (prev_j)
prev_j->next = node_i;
LinkNode* temp = node_i->next;
node_i->next = node_j->next;
node_j->next = temp;
temp = node_i;
node_i = node_j;
node_j = temp;
prev_j = node_j;
node_j = node_j->next;
}
}
}
if (prev_i)
prev_i->next = link;
if (prev)
prev->next = node_i;
LinkNode* temp = link->next;
link->next = node_i->next;
node_i->next = temp;
temp = node_i;
node_i = link;
link = temp;
link = QuickSort(link, prev, node_i);
QuickSort(node_i->next, node_i, end);
return link;
}
//快速排序解法二
LinkNode* qsortL(LinkNode* link, LinkNode* lnext)
{
if (link == NULL)
return lnext;
LinkNode n1, n2;
LinkNode* t1 = &n1, *t2 = &n2;
LinkNode* p = link->next;
while (p)
{
if (p->value < link->value)
{
t1->next = p;
t1 = p;
}
else
{
t2->next = p;
t2 = p;
}
p = p->next;
}
t1->next = t2->next = NULL;
link->next = qsortL(n2.next, lnext);
return qsortL(n1.next, link);
}
int main(int argc, char** argv)
{
LinkNode* link = ContactLink(CreateLinkInc(1, 10, 2), CreateLinkDesc(200, 150, 5));
link = ContactLink(CreateLinkDesc(1000, 100, 100), link);
LinkNode* p = link;
while (p)
{
printf("%d ", p->value);
p = p->next;
}
printf("\n");
link = QuickSort(link, NULL, NULL);
//link = qsortL(link, NULL);
p = link;
while (p)
{
printf("%d ", p->value);
p = p->next;
}
getchar();
return 0;
}