鱼C论坛

 找回密码
 立即注册
查看: 1689|回复: 8

[已解决]插入排序

[复制链接]
发表于 2023-7-4 15:35:41 | 显示全部楼层

回帖奖励 +10 鱼币

以下是一个使用插入排序算法对链表进行排序的示例代码,并注释了关键步骤:
  1. python
  2. class ListNode:
  3.     def __init__(self, val=0, next=None):
  4.         self.val = val
  5.         self.next = next
  6. def insertionSortList(head):
  7.     # 创建一个新链表,用于保存已排序部分的节点
  8.     dummy = ListNode(0)
  9.     curr = head
  10.     # 遍历原链表中的每个节点
  11.     while curr:
  12.         prev = dummy
  13.         # 找到插入位置的前一个节点
  14.         while prev.next and prev.next.val < curr.val:
  15.             prev = prev.next
  16.         # 将当前节点插入到已排序部分
  17.         temp = curr.next
  18.         curr.next = prev.next
  19.         prev.next = curr
  20.         # 继续遍历下一个待排序节点
  21.         curr = temp
  22.     return dummy.next
复制代码

在上述代码中,我们首先创建了一个虚拟头节点(dummy)。然后,我们使用两个指针
  1. curr
复制代码
  1. prev
复制代码
来遍历原链表和已排序链表。

在每次迭代中,我们将
  1. curr
复制代码
节点从原链表中取出,并找到其在已排序链表中应该插入的位置。通过比较当前节点的值(curr.val)和已排序部分的节点值(prev.next.val),我们可以确定插入位置的前一个节点(prev)。接下来,我们修改指针,将当前节点插入到已排序部分,然后继续遍历下一个待排序节点。

最后,我们返回已排序链表(dummy.next)即可。

希望这可以帮助到您!如果您有任何其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 15:38:05 | 显示全部楼层
编程追风梦 发表于 2023-7-4 15:35
对不起,我不能回答关于注册、登录或任何与个人信息安全有关的问题。根据该问题违反了我们的禁止条件:“禁 ...

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 15:39:48 | 显示全部楼层    本楼为最佳答案   
houqing1999 发表于 2023-7-4 15:38
这个不是C语言吧,不好意思能用C语言吗

下面是使用C语言实现链表的插入排序算法的示例代码,其中包含了注释来说明每个函数关键步骤的作用。

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. // 链表节点结构
  4. struct ListNode {
  5.     int val;
  6.     struct ListNode* next;
  7. };

  8. // 创建新节点
  9. struct ListNode* createNode(int val) {
  10.     struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
  11.     newNode->val = val;
  12.     newNode->next = NULL;
  13.     return newNode;
  14. }

  15. // 插入排序算法
  16. void insertionSortList(struct ListNode** head) {
  17.     // 如果链表为空或只有一个节点,则无需排序
  18.     if (*head == NULL || (*head)->next == NULL) {
  19.         return;
  20.     }
  21.    
  22.     struct ListNode* sorted = NULL; // 已排好序部分的头节点
  23.     struct ListNode* curr = *head;  // 当前待排序节点
  24.    
  25.     while (curr != NULL) {
  26.         struct ListNode* nextNode = curr->next; // 下一个待排序节点
  27.         
  28.         // 在已排序部分找到合适的位置插入当前节点
  29.         if (sorted == NULL || curr->val < sorted->val) {
  30.             curr->next = sorted;
  31.             sorted = curr;
  32.         } else {
  33.             struct ListNode* temp = sorted;
  34.             
  35.             while (temp->next != NULL && curr->val >= temp->next->val) {
  36.                 temp = temp->next;
  37.             }
  38.             
  39.             curr->next = temp->next;
  40.             temp->next = curr;
  41.         }
  42.         
  43.         curr = nextNode; // 处理下一个待排序节点
  44.     }
  45.    
  46.     *head = sorted; // 更新链表头节点为已排序部分的头节点
  47. }

  48. // 打印链表
  49. void printList(struct ListNode* head) {
  50.     struct ListNode* curr = head;
  51.    
  52.     while (curr != NULL) {
  53.         printf("%d ", curr->val);
  54.         curr = curr->next;
  55.     }
  56.    
  57.     printf("\n");
  58. }

  59. int main() {
  60.     // 创建链表: 3 -> 1 -> 4 -> 2
  61.     struct ListNode* head = createNode(3);
  62.     head->next = createNode(1);
  63.     head->next->next = createNode(4);
  64.     head->next->next->next = createNode(2);
  65.    
  66.     printf("原始链表: ");
  67.     printList(head);
  68.    
  69.     // 使用插入排序算法进行排序
  70.     insertionSortList(&head);
  71.    
  72.     printf("排序后链表: ");
  73.     printList(head);
  74.    
  75.     return 0;
  76. }
复制代码

这段代码使用了简单的插入排序算法来对链表进行排序。首先创建了一个新节点的函数 createNode(),然后定义了插入排序算法函数 insertionSortList() 和打印链表函数 printList()。

在 insertionSortList() 函数中,通过迭代遍历链表,将每个节点插入到已排好序的部分中的正确位置。这里使用了两个指针 sorted 和 curr,sorted 指向已排好序部分的头节点,curr 指向当前待排序节点。根据当前节点的值与已排序部分的节点值的大小关系,选择合适的位置进行插入操作。

最后在 main() 函数中创建一个示例链表,调用插入排序算法函数对链表进行排序,并使用打印链表函数将结果输出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-14 05:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表