数据结构实验9:归并排序与快速排序解析

需积分: 0 0 下载量 22 浏览量 更新于2024-06-30 收藏 409KB PDF 举报
"09-排序1 - 数据结构实验(9)" 在计算机科学中,排序是一种常见的操作,尤其是在处理大量数据时。本节主要探讨的是内部排序,即数据完全存储在内存中的排序方法。内部排序可以分为多个类别,其中一种是采用分治策略的排序算法。分治策略通过将大问题分解成小问题来解决,然后合并这些小问题的解,以得到原问题的解。 排序中一个关键的概念是找到"枢轴"或"支点"(Pivot Point)。枢轴元素通常用于划分数据,以便在后续步骤中更容易地对数据进行排序。例如,在归并排序中,枢轴用于将数组分成两个部分,这两部分都是有序的。而快速排序则利用枢轴来分割数组,使得一部分的所有元素都小于另一部分的所有元素。 归并排序(Merge Sort)是一种高效的分治算法。其基本步骤如下: 1. 将数组分为两半,分别对左右两半进行递归排序。 2. 当子数组的大小缩小到只剩一个元素时,排序结束。 3. 将两个已排序的子数组合并成一个整体有序的数组。 归并排序的合并过程是关键。给定两个有序数组`sorted([0, pivot))`和`sorted([pivot, N))`,我们创建一个新的数组,并交替从这两个数组中取出较小的元素,直到一个数组为空,然后将另一个数组的剩余部分添加到新数组中。这个过程可以视为从两个队列中选择最小元素的过程,确保合并后的数组仍然有序。 以下是一个C++实现的归并排序模板函数: ```cpp template<typename T> void mergeSort(std::vector<T>& array, int start, int end) { if (end - start < 2) { return; } int mid = start + ((end - start) >> 1); mergeSort(array, start, mid); // 对左半部分进行排序 mergeSort(array, mid, end); // 对右半部分进行排序 merge(array, start, end, mid); // 合并排序后的两部分 } template<typename T> void merge(std::vector<T>& array, int start, int end, int mid) { std::vector<T> array1(array.begin() + start, array.begin() + mid); std::vector<T> array2(array.begin() + mid, array.begin() + end); // 实现合并操作,这里省略具体实现 } ``` 快速排序(Quick Sort)也是基于分治策略的排序算法,它的核心在于选择枢轴元素并将数组划分为两个部分,使得一部分的所有元素都小于枢轴,另一部分的所有元素都大于枢轴。然后对这两部分递归地执行快速排序。快速排序通常比归并排序更快,因为它在平均情况下具有较低的时间复杂度,但由于它不是稳定的排序算法,所以当处理具有相等元素的数组时,结果可能不固定。 总结来说,排序算法是数据结构和算法中的基础组成部分,它们在各种实际应用中都有着广泛的应用。归并排序和快速排序是两种常用的内部排序算法,它们都利用了分治策略,但各自有不同的特点和适用场景。理解这些排序算法的原理和实现细节对于提升编程能力、优化算法性能至关重要。

使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。

2023-06-03 上传