还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据排序教学课件第一章排序基础与重要性什么是排序?重新排列常见规则基础操作将数据按一定规则重新排列,使其呈现特定顺序从小到大(升序)、从大到小(降序)、字母顺排序是数据处理的基础操作,是众多算法的前置序等条件为什么要排序?提高查找效率有序数据可应用二分查找,时间复杂度从On降至Olog n方便数据合并有序数据更容易合并和分析,提高后续处理效率数据库应用排序的应用场景举例邮件时间排序学生成绩排名电商价格排序邮箱应用中的邮件按时间先后顺序排列,便于用教育系统中对学生成绩进行排序,确定名次,评户查找最新或特定时间的邮件估学习效果排序的输入与输出输入无序数据输出有序数据排序算法接收一组无序的数据作为输排序算法处理后输出的有序数据,满足入,这些数据通常以数组或列表的形式前面元素不大于后面元素(升序)或前存储输入数据可以是数字、字符串或面元素不小于后面元素(降序)的条其他可比较的数据类型件[5,2,9,1,7,6]排序的比较基础比较规则一致性要求自定义比较排序算法通过比较元素大小决定它们的相对比较规则必须满足自反性、对称性和传递对于复杂对象,可自定义比较函数,如按学顺序,这是大多数排序算法的核心操作性,确保排序结果的正确性生的成绩、年龄或姓名排序排序前后,数据井然有序第二章经典排序算法详解冒泡排序()Bubble Sort冒泡排序是最简单直观的排序算法之一,其核心思想是•通过相邻元素两两比较,较大元素逐步冒泡到末尾•每轮比较完成后,最大元素会移至当前未排序区间的末尾•重复此过程,直到所有元素排序完成时间复杂度On²,适合小规模数据排序冒泡排序示例步骤第1轮从第一个元素开始,依次与相邻元素比较较大元素向后移动,最大元素冒泡到末尾[5,3,8,4,6]→[3,5,8,4,6]→[3,5,8,4,6]→[3,5,4,8,6]→[3,5,4,6,8]第2轮忽略已排序的最后一个元素,对前面的元素重复第一轮操作次大元素移至倒数第二位[3,5,4,6,8]→[3,4,5,6,8]→[3,4,5,6,8]后续轮次重复上述步骤,每轮确定一个元素的最终位置,直到所有元素排序完成选择排序()Selection Sort选择排序的核心思想是•每轮从未排序区间选择最小元素,放到已排序区间的末尾•已排序区间初始为空,逐步扩大•未排序区间逐步缩小,直到为空时间复杂度On²,空间复杂度O1,是一种原地排序算法选择排序示例步骤初始状态1数组[7,2,4,1,5,3]已排序区间[],未排序区间[7,2,4,1,5,3]2第轮1在未排序区间[7,2,4,1,5,3]中找到最小元素1将1与首位元素7交换[1,2,4,7,5,3]第轮32已排序区间
[1],未排序区间[2,4,7,5,3]在未排序区间[2,4,7,5,3]中找到最小元素22已在正确位置,无需交换[1,2,4,7,5,3]4后续轮次已排序区间[1,2],未排序区间[4,7,5,3]重复上述步骤,每轮确定一个元素的最终位置插入排序()Insertion Sort插入排序的核心思想是•将数组分为已排序和未排序两部分•初始已排序部分只包含第一个元素•逐个将未排序部分的元素插入到已排序部分的合适位置时间复杂度平均On²,最好On,对部分有序数据效率高def insertion_sortarr:for i in range1,lenarr:key=arr[i]j=i-1while j=0and arr[j]key:arr[j+1]=arr[j]j-=1arr[j+1]=keyreturn arr插入排序示例步骤0102初始状态处理第二个元素已排序区间
[5],未排序区间[2,4,6,1,3]取出2,与已排序区间元素比较25,将2插入到5前面结果[2,5,4,6,1,3]0304处理第三个元素继续处理后续元素取出4,与已排序区间元素比较按同样方式处理
6、1和345,将4插入到2和5之间最终结果[1,2,3,4,5,6]结果[2,4,5,6,1,3]插入排序类似于我们整理扑克牌的方式,逐张将新牌插入到手中已经排好序的牌中的合适位置不同策略,不同效率这三种基本排序算法各有特点冒泡排序概念最简单但效率较低;选择排序交换次数最少;插入排序对部分有序数据效率最高在小规模数据和特定场景下,这些简单算法仍有其价值和应用场景第三章高级排序算法与性能分析本章将介绍几种更高效的排序算法,它们采用了更复杂的策略来提高排序效率这些算法在大规模数据排序中表现优异,是实际应用中的首选算法我们还将分析比较各种排序算法的性能特点快速排序()Quick Sort快速排序是实际应用中最常用的排序算法之一,采用分治思想
1.选择一个基准元素(pivot)
2.将数组分为两部分小于基准的元素和大于基准的元素
3.递归对两部分进行排序平均时间复杂度On logn,最坏情况On²def quick_sortarr,low=0,high=None:if highis None:high=lenarr-1if lowhigh:pi=partitionarr,low,highquick_sortarr,low,pi-1quick_sortarr,pi+1,high returnarrdefpartitionarr,low,high:pivot=arr[high]i=low-1forj in rangelow,high:if arr[j]=pivot:i+=1arr[i],arr[j]=arr[j],arr[i]arr[i+1],arr[high]=arr[high],arr[i+1]return i+1归并排序()Merge Sort合并分解将已排序的子数组合并为更大的有序数组,直到最终合并为完整的排序数组将待排序数组递归地分解为规模更小的子数组,直到子数组只包含一个元素(此时认为已排序)
[38]+
[27]→[27,38]
[43]+
[3]→[3,43]
[9]+
[82]→[9,82]
[10][27,38]+[3,43]→[3,27,38,43][9,82]+
[10]→[9,[38,27,43,3,9,82,10]↓[38,27,43,3]+[9,82,10]↓[38,27]10,82][3,27,38,43]+[9,10,82]→[3,9,10,27,38,43,82]+[43,3]+[9,82]+
[10]↓
[38]+
[27]+
[43]+
[3]+
[9]+
[82]+
[10]归并排序是一种稳定的排序算法,时间复杂度为On logn,但需要On的额外空间来存储临时数组堆排序()Heap Sort堆排序利用堆数据结构实现排序
1.构建最大堆(父节点值大于子节点值)
2.将堆顶元素(最大值)与堆尾元素交换
3.减小堆的大小,重新调整为最大堆
4.重复步骤2-3,直到堆的大小为1时间复杂度On logn,空间复杂度O1堆排序是原地排序算法,不需要额外空间,但不是稳定排序def heapifyarr,n,i:largest=i l=2*i+1r=2*i+2if ln andarr[largest]arr[l]:largest=l ifrn andarr[largest]arr[r]:largest=r iflargest!=i:arr[i],arr[largest]=arr[largest],arr[i]heapifyarr,n,largestdef heap_sortarr:n=lenarr#Build maxheap fori inrangen//2-1,-1,-1:heapifyarr,n,i#Extract elementsone byone foriinrangen-1,0,-1:arr[i],arr
[0]=arr
[0],arr[i]heapifyarr,i,0return arr排序算法稳定性什么是稳定性?稳定性的重要性稳定排序相等元素在排序前后的相对位置保持不变在多关键字排序中尤为重要例如不稳定排序相等元素的相对位置可能发生改变•先按成绩排序,再按学号排序•如果成绩排序是稳定的,则可保证成绩相同的学生仍按学号顺序排列各算法稳定性稳定排序冒泡排序、插入排序、归并排序不稳定排序选择排序、快速排序、堆排序时间复杂度比较空间复杂度比较原地排序O1•冒泡排序只需几个临时变量•选择排序只需记录最小元素位置•插入排序只需一个临时变量存储当前元素•堆排序在原数组上构建堆结构•快速排序原地分区,但递归需要栈空间需要额外空间On•归并排序需要额外数组存储合并结果•计数排序需要额外数组存储计数•桶排序需要多个桶存储元素•基数排序需要存储中间结果这些算法牺牲空间换取时间效率排序算法选择指南12小数据量100中等数据量选择插入排序选择快速排序•实现简单,常数因子小•平均性能最好•对接近有序的数据效率很高•空间复杂度低•是许多高级排序算法的子过程•缓存局部性好34大数据量特殊需求选择归并排序(稳定)或堆排序(节省空间)根据具体需求选择•性能稳定,不会出现最坏情况•需要稳定排序归并排序或插入排序•归并排序稳定但需要额外空间•内存受限堆排序•堆排序节省空间但不稳定•有特定范围数据计数排序、基数排序实际案例数据库索引排序数据库索引的本质索引是对数据库表中一列或多列的值进行排序的数据结构,以加快数据检索速度B树和B+树索引大多数关系型数据库使用B树或B+树作为索引结构,这些数据结构维护排序状态,使二分查找成为可能MySQL的InnoDB引擎使用B+树索引,所有数据都按照键值排序存储排序提升查询效率的方式•降低时间复杂度从On到Olog n•减少磁盘I/O有序数据可批量读取•支持范围查询排序使得范围操作高效实际案例电商商品排序优化价格排序最基本的排序功能,允许用户按价格升序或降序浏览商品实现简单,通常使用数据库的ORDERBY语句销量排序根据商品历史销量排序,帮助用户发现热门商品需要定期更新销量数据,可能涉及缓存策略评价排序结合评分和评价数量的复合排序,需要设计合理的加权算法稳定排序确保评分相同的商品可按其他指标排序电商平台通常实现多条件排序,允许用户根据不同维度查看商品排序算法的选择需要考虑数据量、更新频率和稳定性需求例如,商品库存数据频繁变化,需要高效的排序算法;用户浏览历史需要稳定排序以保持一致的用户体验课堂互动手动排序练习模拟冒泡排序给定数组[6,3,8,2,5,4]第一轮
1.比较6和3,交换[3,6,8,2,5,4]
2.比较6和8,不交换[3,6,8,2,5,4]
3.比较8和2,交换[3,6,2,8,5,4]
4.比较8和5,交换[3,6,2,5,8,4]
5.比较8和4,交换[3,6,2,5,4,8]第一轮结束后,最大元素8已移至末尾课堂上,学生可以分组进行此练习,每人负责一轮排序,观察数据如何逐步变得有序这有助于直观理解排序算法的工作原理,加深对算法的印象课堂互动排序算法代码演示插入排序与快速排序对比使用相同输入数据,运行两种排序算法,比较它们的执行时间•小数据集(100个元素)两者性能相近•中等数据集(10,000个元素)快速排序明显更快•大数据集(1,000,000个元素)差距更显著学生可以通过修改参数,观察不同输入规模和数据分布对算法性能的影响import timeimportrandom#生成测试数据data=[random.randint0,10000for_inrange10000]data1=data.copydata2=data.copy#插入排序start=time.timeinsertion_sortdata1end=time.timeprintf插入排序{end-start:.6f}秒#快速排序start=time.timequick_sortdata2end=time.timeprintf快速排序{end-start:.6f}秒总结与回顾经典算法排序基础冒泡排序、选择排序、插入排序排序的定义、重要性和应用场景简单直观,适合小数据量各种比较策略与输入输出特点高级算法快速排序、归并排序、堆排序效率高,适合大数据量实际应用性能分析数据库索引、电商排序不同场景下的算法选择时间复杂度、空间复杂度算法稳定性与适用场景排序算法是计算机科学的基础,也是数据处理的关键一步不同排序算法有各自的优缺点和适用场景,选择合适的排序算法需要考虑数据规模、预排序程度、稳定性需求等因素掌握排序,开启数据处理之门排序算法是数据结构与算法的基础,也是解决实际问题的重要工具通过本课程的学习,你已经了解了各种排序算法的原理和实现方法,以及它们的性能特点和适用场景记住,练习与实践是掌握这些算法的关键希望你能在日后的学习和工作中灵活运用这些知识,成为排序算法的高手!。
个人认证
优秀文档
获得点赞 0