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はリンクリストの長さを表しています。

bannerAds