冒泡排序算法的单链表实现


引言:

这几天都在忙着参加几个工作室(别问为什么是“几个”,问就是海投)的考核,报的都是后台组。后台的考核中必定是少不了单链表ADT和排序算法的。本专栏将专攻排序算法部分。注意,是排序算法的单链表实现,而不是数组排序喔!
强烈建议有排序算法基础的人群食用。“基础”是指了解了这些排序算法如何在数组排序中编写。
那么,废话不多说,开始。


正文:

1)有关冒泡排序算法:这是个很形象的算法,因为用它排序数据时就像冒泡一样,数据一个一个地“往上浮”。自然相邻的两个数据的比较和交换是它的灵魂。

2)单链表实现冒泡排序的难点:冒泡排序数组挺简单的,根据数组的大小可以很容易知道冒泡(即遍历)的次数(数组长度-1)。但是单链表没有数组那样的下标。所以,解决清楚冒泡次数问题是解决编写算法的关键。

3)解决难点:
I.你可以遍历一遍链表,从而知道结点的数量,从而知道冒泡次数。这不失为一种办法,但是,这样就莫得单链表实现的灵魂了,因为这样,本质上还是排序数组的那一套。而且,当结点数(数据量)超大时,这样做会浪费不必要的时间。
II.用一个结点指针标记无序部分(即还未排好序部分)的末尾,这个指针将相当于数组下标的功能。

4)上代码:

/**************************************************************
*	Struct Define Section
**************************************************************/

// define data type
typedef int DataType;

// define struct of linked list
typedef struct LNode {
     
    DataType data;
    struct LNode* next;
}LNode;
void bubbleSort(LNode* list)
{
     
	if (NULL == list)
		printf("You haven't entered any data.\n");
	else {
     
		LNode* endPtr = NULL;     //endPtr和数组的最大下标是等价的功能,即记录“冒泡”次数
		LNode* curPtr = list;

		//while (curPtr->next != endPtr):当endPtr指向链表头结点的下一个结点时,冒泡排序全部完成
		while (curPtr->next != endPtr) {
     
			LNode* nextPtr = curPtr->next;       //curPtr->data和nextPtr->data自然相邻的两个数据,它们将进行比较

            //while (nextPtr != endPtr):每次进行排序的都是endPtr之前的数据,因为endPtr以及其后面的数据都是有序的了
			while (nextPtr != endPtr) {
     
				if (curPtr->data > nextPtr->data) {
                  //比较并且交换。这里是升序排序
					curPtr->data += nextPtr->data;
					nextPtr->data = curPtr->data - nextPtr->data;
					curPtr->data -= nextPtr->data;
				}

			    //curPtr和nextPtr一起后移
				curPtr = nextPtr;
				nextPtr = nextPtr->next;
			}

			endPtr = curPtr;     //每一轮冒泡完成之后,末尾结束标记点前移
			curPtr = list;       //再次从头结点开始冒泡
		}
	}
}

5)思考:为什么是while (curPtr->next != endPtr),而不是while (curPtr != endPtr)?
提示:用一个包含4个结点的单链表,按照我上面的代码一步步手工推演就能知道答案了。毕竟,再怎样看别人的博客,也要有自己的思考。解答我会放在文末。


近期话题(我眼中的):
1.网课:前不久还在笑初三党和高三党要上网课,没想到这么快也就降临到自己头上了
2.xz:别说了,米古月


最近兴趣:
1.工作室考核
2.浅层次的钻研Deepfacelab的使用。说到deepfacelab,真的是很好玩,再一次让我见识了AI的强大和奇妙
3.摆弄google colab。很气人,因为SSR节点不太稳定,老是断网。顺便在这里求告知几个稳定的SSR节点:)


leisure time:
前两天被一个error搞到心态炸裂,足足花费了我两个多小时去google、翻博客,最后愣是没解决。
更加玄的是,明明昨晚上运行着还是很好的。第二天一觉醒来,再次F5,就编译不了了。就是这么神奇:)
附上error给你们瞧瞧:1>linkedList.obj : error LNK2019: unresolved external symbol _system25 referenced in function _main
编译用的IDE是VS2019


See you next blog!

最后,“思考”的解答:我说了,“每次进行排序的都是endPtr之前的数据,因为endPtr以及其后面的数据都是有序的了”
所以,当进行到curPtr->next = endPtr,没排序的节点就只剩一个了,当然不用再继续了。

你可能感兴趣的:(排序算法的单链表实现,排序算法,单链表,c语言)