插入排序算法的单链表实现


引言:

被工作室考核搞到精疲力尽。今天一如既往来讲解一下后台考核常考排序算法之插入排序算法。
但,一如既往的是,本篇讲解的也是用单链表来实现插入排序算法
建议:先去了解一下插入排序算法的数组实现。
废话不多说,GO GO


正文:

1)有关插入排序算法:一种简单直观且稳定的排序算法。核心:往已经排好序的数据中插入一个另外的数据,要求插入之后,这部分数据仍是保持有序状态。

2)单链表实现插入排序的难点:由于不像数组那样有下标,可以通过下标随意地向前或者向后访问数据,单链表必须通过指针单向地对数据进行访问。这主要是对排序过程中数据的插入造成了影响,以及如何将链表分成有序部分和无序部分

3)解决难点:
I.在数据的插入(即结点的连接)方面下功夫。主要是区别在头结点前插入结点和在头结点之后插入结点分别该怎样操作。
II.将原链表的头结点和其他部分断裂开,这样就形成了有序部分(头结点部分)和无序部分(头结点之外的部分),见下图
原链表:

head
data1
data2
data3
data4
NULL

断裂后
有序部分:

head
NULL

无序部分:

data1
data2
data3
data4
NULL

之后,只需把无序部分的数据不断地插入有序部分就可以了。

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 insertionSort(LNode** list)
{
     
	LNode* head;		//无序部分(即待排序部分)的头结点
	LNode* preNode;
	LNode* curNode;		
	LNode* temp;		//待插入的结点

	if (*list == NULL) {
     
		printf("You haven't entered any data.\n");
		return;
	}

	head = (*list)->next;
	(*list)->next = NULL;

	while (head) {
     
		//寻找被插入的结点
		for (temp = head, curNode = (*list), preNode = curNode;
			(curNode != NULL) && (curNode->data <= temp->data);
			preNode = curNode, curNode = curNode->next);

		head = head->next;
		if (curNode == *list) {
     		//在有序部分头结点前插入
			*list = temp;
		}
		else {
     
			preNode->next = temp;	//在有序部分头结点之后插入
		}
		temp->next = curNode;
	}
}

5)思考:如果用双链表来实现插入排序算法是否比单链表更简单呢?毕竟双链表可以向前或者向后访问数据,和数组很相似。


近期话题(我眼中的):
1.各种工作室的各种考核(害~)


近期兴趣:
1.喵内噶~ [doge]


leisure time:
在google colab上如果没分到GPU,然后跑训练deepfacelab的SAEHD模型,bite_size为8使,训练一个点要190多秒。
别问我是怎么知道的(-_-||)


See you next blog!

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