链表的排序(冒泡、快排)

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);////递归排序比基准大的链表
	
}

猜你喜欢

转载自blog.csdn.net/Z_JUAN1/article/details/81083639