用数据结构c语言版,具体代码实现,链式结构上简单算法排序
时间: 2023-08-24 07:05:12 浏览: 101
好的,这里给您提供一个链式结构上的简单排序算法的C语言版实现,代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 合并两个有序链表
ListNode *merge(ListNode *left, ListNode *right) {
ListNode *dummy = (ListNode *)malloc(sizeof(ListNode));
ListNode *p = dummy;
while (left && right) {
if (left->val < right->val) {
p->next = left;
left = left->next;
} else {
p->next = right;
right = right->next;
}
p = p->next;
}
p->next = left ? left : right;
return dummy->next;
}
// 链表排序
ListNode *sortList(ListNode *head) {
if (!head || !head->next) {
return head;
}
ListNode *slow = head, *fast = head->next;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode *mid = slow->next;
slow->next = NULL;
ListNode *left = sortList(head);
ListNode *right = sortList(mid);
return merge(left, right);
}
// 创建链表
ListNode *createList(int arr[], int n) {
ListNode *head = NULL, *p = NULL;
for (int i = 0; i < n; i++) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->val = arr[i];
node->next = NULL;
if (!head) {
head = p = node;
} else {
p->next = node;
p = node;
}
}
return head;
}
// 打印链表
void printList(ListNode *head) {
ListNode *p = head;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main() {
int arr[] = {3, 2, 1, 5, 4};
int n = sizeof(arr) / sizeof(int);
ListNode *head = createList(arr, n);
printf("Before sorting: ");
printList(head);
head = sortList(head);
printf("After sorting: ");
printList(head);
return 0;
}
```
这里的思路与前面的Python版实现相同,使用快慢指针将链表分成左右两部分,然后递归对左右两部分进行排序,最后将两个有序链表合并即可。时间复杂度为O(nlogn),空间复杂度为O(logn)。
阅读全文