單向鏈表的冒泡排序和快速排序

冒泡排序:

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章