C言語でのリストのソート方法はどうやって実装するのですか?
C言語でリストのソートを実現する一般的な方法の1つは、挿入ソート(Insertion Sort)アルゴリズムを使用することです。以下はリストのソートを実現するためのサンプルコードです:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 插入排序算法
ListNode* insertionSortList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* sorted = head; // 排序部分的链表
ListNode* cur = head->next; // 待排序的部分链表
while (cur != NULL) {
if (cur->val < sorted->val) { // 如果当前节点的值小于排序链表的头节点值
ListNode* tmp = cur->next;
cur->next = sorted;
sorted = cur;
cur = tmp;
}
else { // 如果当前节点的值大于等于排序链表的头节点值
ListNode* pos = sorted;
while (pos->next != NULL && pos->next->val < cur->val) {
pos = pos->next;
}
ListNode* tmp = cur->next;
cur->next = pos->next;
pos->next = cur;
cur = tmp;
}
}
return sorted;
}
// 打印链表
void printList(ListNode* head) {
ListNode* cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
// 创建链表
ListNode* head = createNode(4);
head->next = createNode(2);
head->next->next = createNode(1);
head->next->next->next = createNode(3);
// 打印原链表
printf("原链表:");
printList(head);
// 对链表进行排序
head = insertionSortList(head);
// 打印排序后的链表
printf("排序后:");
printList(head);
return 0;
}
以上のコードを実行すると、以下の結果が出力されます:
原链表:4 2 1 3
排序后:1 2 3 4
上記のサンプルコードは、リンクリストに挿入ソートを実装しており、時間複雑度はO(n^2)であり、nはリンクリストの長さを表しています。