用c语言选取一个合适的数据结构存储一批数据,能对数据进行插入和删除操作,还能分别用三种不同的排序算法对这些数据进行排序

时间: 2024-02-22 09:57:52 浏览: 21
可以使用链表来存储一批数据,并可以对数据进行插入和删除操作。链表的头结点存储链表的长度,每个节点存储一个数据元素。 在链表中,可以使用插入排序、快速排序和归并排序等算法对数据进行排序。这里简单介绍一下这三种排序算法的实现。 1. 插入排序 插入排序的思路是,将数组分为已排序区间和未排序区间,每次取未排序区间的第一个元素,插入已排序区间的合适位置。在链表中,可以从头节点开始遍历链表,将未排序节点插入已排序区间的合适位置。 ```c void insertion_sort(struct ListNode* head) { if (!head || !head->next) { return; } struct ListNode* sorted = head->next; head->next = NULL; while (sorted) { struct ListNode* node = sorted; sorted = sorted->next; struct ListNode* cur = head; while (cur->next && cur->next->val < node->val) { cur = cur->next; } node->next = cur->next; cur->next = node; } } ``` 2. 快速排序 快速排序的思路是,在数组中选择一个基准元素,将数组分为左右两个部分,左边部分的元素都小于基准元素,右边部分的元素都大于基准元素,然后对左右两个部分分别进行快速排序。在链表中,可以将链表分为左右两个部分,使用快慢指针找到链表的中间节点,然后对左右两个部分分别进行快速排序。 ```c struct ListNode* partition(struct ListNode* head, struct ListNode* end, struct ListNode** new_head, struct ListNode** new_end) { struct ListNode* pivot = end; struct ListNode* prev = NULL; struct ListNode* cur = head; struct ListNode* tail = pivot; while (cur != pivot) { if (cur->val < pivot->val) { if (!(*new_head)) { *new_head = cur; } prev = cur; cur = cur->next; } else { if (prev) { prev->next = cur->next; } struct ListNode* tmp = cur->next; cur->next = NULL; tail->next = cur; tail = cur; cur = tmp; } } if (!(*new_head)) { *new_head = pivot; } *new_end = tail; return pivot; } struct ListNode* quick_sort_helper(struct ListNode* head, struct ListNode* end) { if (!head || head == end) { return head; } struct ListNode* new_head = NULL; struct ListNode* new_end = NULL; struct ListNode* pivot = partition(head, end, &new_head, &new_end); if (new_head != pivot) { struct ListNode* tmp = new_head; while (tmp->next != pivot) { tmp = tmp->next; } tmp->next = NULL; new_head = quick_sort_helper(new_head, tmp); tmp = get_tail(new_head); tmp->next = pivot; } pivot->next = quick_sort_helper(pivot->next, new_end); return new_head; } void quick_sort(struct ListNode* head) { if (!head || !head->next) { return; } struct ListNode* tail = get_tail(head); head = quick_sort_helper(head, tail); } ``` 3. 归并排序 归并排序的思路是,将数组分为两个部分,分别对左右两个部分进行归并排序,然后将左右两个部分合并。在链表中,可以使用快慢指针将链表分为两个部分,然后分别对左右两个部分进行归并排序,然后将左右两个部分合并。 ```c struct ListNode* merge(struct ListNode* l1, struct ListNode* l2) { struct ListNode dummy = {0}; struct ListNode* cur = &dummy; while (l1 && l2) { if (l1->val < l2->val) { cur->next = l1; l1 = l1->next; } else { cur->next = l2; l2 = l2->next; } cur = cur->next; } if (l1) { cur->next = l1; } if (l2) { cur->next = l2; } return dummy.next; } struct ListNode* merge_sort_helper(struct ListNode* head) { if (!head || !head->next) { return head; } struct ListNode* slow = head; struct ListNode* fast = head->next; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } struct ListNode* right = slow->next; slow->next = NULL; struct ListNode* left = merge_sort_helper(head); right = merge_sort_helper(right); return merge(left, right); } void merge_sort(struct ListNode* head) { if (!head || !head->next) { return; } head = merge_sort_helper(head); } ``` 上面的代码中,`struct ListNode` 表示链表节点的结构体,包含了一个整型变量 `val` 和一个指向下一个节点的指针 `next`。`get_tail` 函数用于获取链表的尾节点,`partition` 函数用于将链表分为左右两个部分,`merge` 函数用于将两个有序链表合并为一个有序链表。

最新推荐

recommend-type

数据结构(C语言版)1800道题及答案[完整版].doc

数据结构(C语言)1800道题与答案,数据结构,C语言,题目与答案,可用于复习考研,可做学习用。童叟无欺
recommend-type

C语言数据结构实现链表逆序并输出

主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
recommend-type

C语言:一元多项式加减法运算(链表 附答案).docx

C语言链表的入门题,里面提供了两种思路供参考,用链表来实现一元多项式的加减法,并按照一定规律输出。也是练习链表和排序算法的一道小实验,初学链表的小伙伴可以参考参考噢
recommend-type

C语言数据结构之平衡二叉树(AVL树)实现方法示例

主要介绍了C语言数据结构之平衡二叉树(AVL树)实现方法,结合实例形式分析了C语言平衡二叉树的相关定义与使用技巧,需要的朋友可以参考下
recommend-type

C语言实现带头结点的链表的创建、查找、插入、删除操作

主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MySQL数据库性能提升秘籍:揭秘性能下降幕后真凶及解决策略

![MySQL数据库性能提升秘籍:揭秘性能下降幕后真凶及解决策略](http://xiaoyuge.work/explain-sql/index/2.png) # 1. MySQL数据库性能优化概述** MySQL数据库性能优化是一项至关重要的任务,可以显著提高应用程序的响应时间和整体用户体验。优化涉及识别和解决影响数据库性能的因素,包括硬件资源瓶颈、软件配置不当和数据库设计缺陷。通过采取适当的优化策略,可以显著提升数据库性能,满足业务需求并提高用户满意度。 # 2. MySQL数据库性能下降的幕后真凶 ### 2.1 硬件资源瓶颈 #### 2.1.1 CPU利用率过高 **症状:
recommend-type

如何在unity创建按钮

在 Unity 中创建按钮的步骤如下: 1. 在 Unity 中创建一个 UI Canvas,选择 GameObject -> UI -> Canvas。 2. 在 Canvas 中创建一个按钮,选择 GameObject -> UI -> Button。 3. 在场景视图中调整按钮的位置和大小。 4. 在 Inspector 中设置按钮的文本、颜色、字体等属性。 5. 添加按钮的响应事件,选择按钮,在 Inspector 的 On Click () 中添加相应的方法。 这样就可以创建一个按钮了,你可以在游戏中使用它来触发相应的操作。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。