链表排序算法c语言(c语言对链表进行排序)

## 链表排序算法 C语言实现### 简介链表是一种线性数据结构,其元素以节点的形式存储,每个节点包含数据和指向下一个节点的指针。链表的优势在于动态内存分配,可以轻松插入和删除元素。然而,排序链表则需要特殊算法来实现。本文将介绍几种常见的链表排序算法,并提供 C语言代码实现。### 1. 冒泡排序#### 1.1 算法原理冒泡排序是一种简单的排序算法,它通过不断比较相邻元素,将较大的元素交换到后面,最终实现从小到大排序。#### 1.2 算法步骤1. 遍历链表,比较相邻元素。 2. 如果元素顺序错误,则交换元素位置。 3. 重复步骤 1 和 2,直到整个链表有序。#### 1.3 C语言实现```c #include #include // 链表节点结构 struct Node {int data;struct Node

next; };// 创建新节点 struct Node

newNode(int data) {struct Node

node = (struct Node

)malloc(sizeof(struct Node));node->data = data;node->next = NULL;return node; }// 冒泡排序链表 void bubbleSort(struct Node

headRef) {struct Node

current =

headRef,

index = NULL;int swapped;if (

headRef == NULL || (

headRef)->next == NULL) {return;}do {swapped = 0;current =

headRef;while (current->next != index) {if (current->data > current->next->data) {// 交换数据int temp = current->data;current->data = current->next->data;current->next->data = temp;swapped = 1;}current = current->next;}index = current;} while (swapped); }// 打印链表 void printList(struct Node

node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n"); }int main() {struct Node

head = newNode(5);head->next = newNode(1);head->next->next = newNode(4);head->next->next->next = newNode(2);head->next->next->next->next = newNode(8);printf("Unsorted linked list: ");printList(head);bubbleSort(&head);printf("Sorted linked list: ");printList(head);return 0; } ```### 2. 插入排序#### 2.1 算法原理插入排序类似于我们整理扑克牌的方式。首先,我们假设第一个节点已排序。然后,我们遍历剩余节点,将每个节点插入到已排序部分的正确位置。#### 2.2 算法步骤1. 创建一个新的链表,将第一个节点插入其中。 2. 遍历原始链表的剩余节点。 3. 对于每个节点,在已排序链表中找到其正确位置,并将其插入。#### 2.3 C语言实现```c #include #include // 链表节点结构 struct Node {int data;struct Node

next; };// 创建新节点 struct Node

newNode(int data) {struct Node

node = (struct Node

)malloc(sizeof(struct Node));node->data = data;node->next = NULL;return node; }// 插入排序链表 void insertionSort(struct Node

headRef) {struct Node

sorted = NULL,

current =

headRef,

next = NULL;while (current != NULL) {next = current->next;// 在已排序链表中找到插入位置while (sorted != NULL && sorted->data > current->data) {sorted = sorted->next;}// 插入节点current->next = sorted;sorted = current;current = next;}// 更新原始链表的头节点

headRef = sorted; }// 打印链表 void printList(struct Node

node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n"); }int main() {struct Node

head = newNode(5);head->next = newNode(1);head->next->next = newNode(4);head->next->next->next = newNode(2);head->next->next->next->next = newNode(8);printf("Unsorted linked list: ");printList(head);insertionSort(&head);printf("Sorted linked list: ");printList(head);return 0; } ```### 3. 归并排序#### 3.1 算法原理归并排序是一种分治算法,它将链表递归地分割成子链表,然后对子链表进行排序,最后将排序后的子链表合并成最终的排序链表。#### 3.2 算法步骤1. 将链表分割成两个子链表。 2. 递归地对子链表进行排序。 3. 合并两个排序后的子链表。#### 3.3 C语言实现```c #include #include // 链表节点结构 struct Node {int data;struct Node

next; };// 创建新节点 struct Node

newNode(int data) {struct Node

node = (struct Node

)malloc(sizeof(struct Node));node->data = data;node->next = NULL;return node; }// 合并两个排序链表 struct Node

mergeSorted(struct Node

a, struct Node

b) {struct Node

result = NULL;if (a == NULL) {return b;}if (b == NULL) {return a;}if (a->data <= b->data) {result = a;result->next = mergeSorted(a->next, b);} else {result = b;result->next = mergeSorted(a, b->next);}return result; }// 归并排序链表 struct Node

mergeSort(struct Node

head) {if (head == NULL || head->next == NULL) {return head;}// 找到链表的中点struct Node

middle = getMiddle(head);struct Node

nextOfMiddle = middle->next;middle->next = NULL;// 递归排序两个子链表struct Node

left = mergeSort(head);struct Node

right = mergeSort(nextOfMiddle);// 合并两个排序后的子链表return mergeSorted(left, right); }// 找到链表的中点 struct Node

getMiddle(struct Node

head) {if (head == NULL || head->next == NULL) {return head;}struct Node

slow = head;struct Node

fast = head->next;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;}return slow; }// 打印链表 void printList(struct Node

node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n"); }int main() {struct Node

head = newNode(5);head->next = newNode(1);head->next->next = newNode(4);head->next->next->next = newNode(2);head->next->next->next->next = newNode(8);printf("Unsorted linked list: ");printList(head);head = mergeSort(head);printf("Sorted linked list: ");printList(head);return 0; } ```### 总结本文介绍了三种常见的链表排序算法:冒泡排序、插入排序和归并排序,并提供了 C语言实现。

冒泡排序和插入排序是简单的排序算法,它们的时间复杂度为 O(n^2),不适合处理大型链表。

归并排序是一种更有效率的排序算法,其时间复杂度为 O(n log n),适合处理大型链表。选择哪种排序算法取决于链表的大小和效率需求。

链表排序算法 C语言实现

简介链表是一种线性数据结构,其元素以节点的形式存储,每个节点包含数据和指向下一个节点的指针。链表的优势在于动态内存分配,可以轻松插入和删除元素。然而,排序链表则需要特殊算法来实现。本文将介绍几种常见的链表排序算法,并提供 C语言代码实现。

1. 冒泡排序

1.1 算法原理冒泡排序是一种简单的排序算法,它通过不断比较相邻元素,将较大的元素交换到后面,最终实现从小到大排序。

1.2 算法步骤1. 遍历链表,比较相邻元素。 2. 如果元素顺序错误,则交换元素位置。 3. 重复步骤 1 和 2,直到整个链表有序。

1.3 C语言实现```c

include

include // 链表节点结构 struct Node {int data;struct Node *next; };// 创建新节点 struct Node* newNode(int data) {struct Node* node = (struct Node*)malloc(sizeof(struct Node));node->data = data;node->next = NULL;return node; }// 冒泡排序链表 void bubbleSort(struct Node** headRef) {struct Node *current = *headRef, *index = NULL;int swapped;if (*headRef == NULL || (*headRef)->next == NULL) {return;}do {swapped = 0;current = *headRef;while (current->next != index) {if (current->data > current->next->data) {// 交换数据int temp = current->data;current->data = current->next->data;current->next->data = temp;swapped = 1;}current = current->next;}index = current;} while (swapped); }// 打印链表 void printList(struct Node* node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n"); }int main() {struct Node* head = newNode(5);head->next = newNode(1);head->next->next = newNode(4);head->next->next->next = newNode(2);head->next->next->next->next = newNode(8);printf("Unsorted linked list: ");printList(head);bubbleSort(&head);printf("Sorted linked list: ");printList(head);return 0; } ```

2. 插入排序

2.1 算法原理插入排序类似于我们整理扑克牌的方式。首先,我们假设第一个节点已排序。然后,我们遍历剩余节点,将每个节点插入到已排序部分的正确位置。

2.2 算法步骤1. 创建一个新的链表,将第一个节点插入其中。 2. 遍历原始链表的剩余节点。 3. 对于每个节点,在已排序链表中找到其正确位置,并将其插入。

2.3 C语言实现```c

include

include // 链表节点结构 struct Node {int data;struct Node *next; };// 创建新节点 struct Node* newNode(int data) {struct Node* node = (struct Node*)malloc(sizeof(struct Node));node->data = data;node->next = NULL;return node; }// 插入排序链表 void insertionSort(struct Node** headRef) {struct Node *sorted = NULL, *current = *headRef, *next = NULL;while (current != NULL) {next = current->next;// 在已排序链表中找到插入位置while (sorted != NULL && sorted->data > current->data) {sorted = sorted->next;}// 插入节点current->next = sorted;sorted = current;current = next;}// 更新原始链表的头节点*headRef = sorted; }// 打印链表 void printList(struct Node* node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n"); }int main() {struct Node* head = newNode(5);head->next = newNode(1);head->next->next = newNode(4);head->next->next->next = newNode(2);head->next->next->next->next = newNode(8);printf("Unsorted linked list: ");printList(head);insertionSort(&head);printf("Sorted linked list: ");printList(head);return 0; } ```

3. 归并排序

3.1 算法原理归并排序是一种分治算法,它将链表递归地分割成子链表,然后对子链表进行排序,最后将排序后的子链表合并成最终的排序链表。

3.2 算法步骤1. 将链表分割成两个子链表。 2. 递归地对子链表进行排序。 3. 合并两个排序后的子链表。

3.3 C语言实现```c

include

include // 链表节点结构 struct Node {int data;struct Node *next; };// 创建新节点 struct Node* newNode(int data) {struct Node* node = (struct Node*)malloc(sizeof(struct Node));node->data = data;node->next = NULL;return node; }// 合并两个排序链表 struct Node* mergeSorted(struct Node* a, struct Node* b) {struct Node* result = NULL;if (a == NULL) {return b;}if (b == NULL) {return a;}if (a->data <= b->data) {result = a;result->next = mergeSorted(a->next, b);} else {result = b;result->next = mergeSorted(a, b->next);}return result; }// 归并排序链表 struct Node* mergeSort(struct Node* head) {if (head == NULL || head->next == NULL) {return head;}// 找到链表的中点struct Node* middle = getMiddle(head);struct Node* nextOfMiddle = middle->next;middle->next = NULL;// 递归排序两个子链表struct Node* left = mergeSort(head);struct Node* right = mergeSort(nextOfMiddle);// 合并两个排序后的子链表return mergeSorted(left, right); }// 找到链表的中点 struct Node* getMiddle(struct Node* head) {if (head == NULL || head->next == NULL) {return head;}struct Node* slow = head;struct Node* fast = head->next;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;}return slow; }// 打印链表 void printList(struct Node* node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n"); }int main() {struct Node* head = newNode(5);head->next = newNode(1);head->next->next = newNode(4);head->next->next->next = newNode(2);head->next->next->next->next = newNode(8);printf("Unsorted linked list: ");printList(head);head = mergeSort(head);printf("Sorted linked list: ");printList(head);return 0; } ```

总结本文介绍了三种常见的链表排序算法:冒泡排序、插入排序和归并排序,并提供了 C语言实现。* 冒泡排序和插入排序是简单的排序算法,它们的时间复杂度为 O(n^2),不适合处理大型链表。 * 归并排序是一种更有效率的排序算法,其时间复杂度为 O(n log n),适合处理大型链表。选择哪种排序算法取决于链表的大小和效率需求。

标签列表