版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
概述插入排序快速排序选择排序归并排序小结第十章内部排序概述排序:将一组杂乱无章的记录按一定的规律顺次排列起来。
关键字(key):通常数据记录有多个属性域,即多个数据成员组成,其中有一个属性域可用来区分记录,作为排序依据。该域即为关键字。主关键字:如果在待排序记录序列中各个记录的关键字互不相同,这种关键字即主关键字。按照主关键字进行排序,排序的结果是唯一的。次关键字:待排序记录序列中有些记录的关键字可能相同,这种关键字称为次关键字。按照次关键字进行排序,排序的结果可能不唯一。排序算法的稳定性:如果在记录序列中有两个记录R[i]和R[j],它们的关键字k[i]==k[j],且在排序之前,记录R[i]排在R[j]前面。如果在排序之后,记录R[i]仍在记录R[j]的前面,那么称这个排序方法是稳定的,否那么称这个排序方法是不稳定的。内排序与外排序:内排序是指在排序期间数据记录全部存放在内存的排序;外排序是指在排序期间全部记录个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。排序的时间开销:排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的记录比较次数与记录移动次数来衡量。各节给出算法运行时间代价的大概估算一般都按平均情况进行估算。对于那些受记录关键字序列初始排列及记录个数影响较大的,需要按最好情况和最坏情况进行估算。算法执行时所需的附加存储:评价算法好坏的另一标准。待排序记录的存储方式:以一维数组作为存储结构,排序时必须实际移动记录;以链表(动态链表或静态链表)作为存储结构,排序时不用物理移动记录,只需修改指针;有的排序方法难于在链表上实现,且需要防止排序过程中的记录移动,可将待排序记录本身存储在一组地址连续的存储单元内,同时附设一个指示记录存储位置的地址向量,排序过程中不移动记录,而移动地址向量中这些记录的地址。待排序记录的数据类型说明:#defineMAXSIZE20typedefintKeyType;typedefstruct{KeyTypekey;InfoTypeotherinfo;}RedType;typedefstruct{RedTyper[MAXSIZE];intlength;}SqList;插入排序(InsertSorting)直接插入排序的根本思想是:当插入第i(i1)个记录时,前面的R[1],R[2],…,R[i-1]已经排好序。这时,用R[i]的关键字与R[i-1],R[i-2],…的关键字顺序进行比较,找到插入位置即将R[i]插入,原来位置上的记录向后顺移。根本方法:每步将一个待排序的记录,按其关键字大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。直接插入排序(InsertSort)各趟排序结果21254925*1608123456123456temp21254925*160825i=2123456temp21254925*160849i=321254925*1608123456tempi=425*123456temp21254925*1608i=516123456temp21254925*1608i=60821254925*1608123456i=5时的排序过程完成1616123456temp21254925*0816i=5j=44916123456temp21254925*0816i=5j=325*1621254925*0812345616i=5j=22516123456temp214925*081625i=5j=1123456temp21254925*081621i=5j=016对顺序表直接插入排序的算法:
voidInsertSort(SqList&L){inti,j;for(i=2;i<=L.length;++i)if(L.r[i].key<L.r[i-1].key)//"<",需将L.r[i]插入有序子表{L.r[0]=L.r[i];//复制为哨兵
L.r[i]=L.r[i-1];for(j=i-2;L.r[0].key<L.r[j].key;--j)L.r[j+1]=L.r[j]; //记录后移L.r[j+1]=L.r[0];//插入到正确位置}}
保存记录L.r[i]的副本;监视下标j是否越界,自动控制循环结束说明:监视哨L.r[0]的作用:直接插入排序的算法简洁,容易实现。从时间来看,排序的根本操作为:比较两个记录的大小和移动记录。其中:最小比较次数:Cmin=n-1=O(n)最大比较次数:Cmax=(2+3+…+n)=(n+2)(n-1)/2=O(n2)最小移动次数:Mmin=0最大移动次数:Mmax=(2+1+3+1+…+n+1)=O(n2)假设待排序记录序列中出现各种可能排列的概率相同,那么可取上述最好情况和最坏情况的平均情况。在平均情况下的关键字比较次数和记录移动次数约为n2/4。因此,直接插入排序的时间复杂度为o(n2)。算法分析:关键字比较次数和记录移动次数与记录关键字的初始排列有关。从空间看,直接插入排序算法只需一个记录的辅助空间。直接插入排序是一种稳定的排序方法。折半插入排序(BinaryInsertsort)根本思想:设在顺序表中有一个记录序列R[1],R[2],…,R[n]。其中,R[1],R[2],…,R[i-1]是已经排好序的记录。在插入R[i]时,利用折半搜索法寻找R[i]的插入位置。
折半插入排序的算法:voidBInsertSort(SqList&L){
inti,j,m,low,high;for(i=2;i<=L.length;++i){L.r[0]=L.r[i];//将L.r[i]暂存到L.r[0]low=1;high=i-1;while(low<=high){//在r[low..high]中折半查找有序插入的位置
m=(low+high)/2;//折半
if(L.r[0].key<L.r[m].key)high=m-1;//插入点在低半区
elselow=m+1;//插入点在高半区
}for(j=i-1;j>=high+1;--j)L.r[j+1]=L.r[j];//记录后移
L.r[high+1]=L.r[0];//插入
}}算法分析:折半插入排序所需要的关键字比较次数与待排序记录序列的初始排列无关,仅依赖于记录个数。在插入第i个记录时,需要经过log2i+1次关键字比较,才能确定它应插入的位置。将n个记录用折半插入排序所进行的关键字比较次数为O(nlog2n).折半插入排序的时间复杂度仍为O〔n2〕当n较大时,总的关键字比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差。在记录的初始排列已经按关键字排好序或接近有序时,直接插入排序比折半插入排序执行的关键字比较次数要少。折半插入排序的记录移动次数与直接插入排序相同,依赖于记录的初始排列。折半插入排序是一个稳定的排序方法。希尔排序(ShellSort)从对直接插入排序的分析可知,其时间复杂度为O(n2),但是当待排序记录处于“根本有序〞状态或当n值较小时,直接插入排序的效率可大大提高。Shell排序方法正是基于这两点考虑对直接插入排序加以改进而提出的一种插入排序算法。Shell排序方法是一种“逐渐缩小插入间隔〞的插入排序方法,在时间效率上较直接插入排序有较大的改进。先确定一个小于n的整数d1作为第一个增量,把记录序列分为d1个组,所有距离为d1倍数的记录放在同一个组中,在各组内进行直接插入排序;然后,取第二个增量d2〔d2<d1〕,重复上述分组和排序,直至所取的增量dt=1〔dt<dt-1<…<d2<d1〕,即所有记录处在同一组中进行直接插入排序为止。Shell排序的根本做法:21254925*16081234562125*i=1d1=34925160825164925*08210849252125*1621254925*160812345621i=208d2=225491625*160821254925*4908162125*2521254925*160801234521i=308d3=125164925*开始时增量值较大,子序列中的记录较少,排序速度较快;随着排序进展,增量值逐渐变小,子序列中记录个数逐渐变多,由于前面工作的根底,大多数记录已根本有序,所以排序速度仍然很快。voidShellInsert(SqList&L,intdk){for(i=dk+1;i<=L.Length;i++)if(L.r[i].key<L.r[i-dk].key){//需将L.r[i]插入有序增量子表 L.r[0]=L.r[i];//暂存在L.r[0],但不是哨兵。 for(j=i-dk;j>0&&L.r[0].key<L.r[j].key;j-=dk)L.r[j+dk]=L.r[j];//记录后移,查找插入位置 L.r[j+dk]=L.r[0];}}voidShellSort(SqList&L,intdlta[],intt){//按增量序列dlta[0..t-1]对顺序表L作希尔排序for(k=0;k<t;t++){ShellInsert(L,dlta[k]);//一趟增量为dlta[k]的插入排序}
希尔排序的算法:增量的取法有多种。最初shell提出取d1=n/2,d2=d1/2,直到dt=1。后来knuth提出取di+1=di/3+1。还有人提出都取奇数为好,也有人提出各增量互质为好。算法分析:对特定的待排序记录序列,可以准确地估算关键字的比较次数和记录移动次数。但想要弄清关键字比较次数和记录移动次数与增量选择之间的依赖关系,并给出完整的数学分析,还没有人能够做到。快速排序(ExchangeSort)根本方法:比较相邻两个记录的关键字,假设R[i].key>R[i+1].key,那么交换之,其中i从0到n-pass-1〔pass的初值为1〕称之为一趟起泡排序,其结果是使最大关键字的记录被交换到n-pass的位置上,如果某一趟起泡排序过程中没有进行一次记录的交换,那么排序过程结束。最坏情况下需n-1趟排序。根本思想:是两两比较待排序记录的关键字,如果发生逆序(即排列顺序与排序后的次序正好相反),那么交换之,直到所有记录都排好序为止。起泡排序(BubbleSort)21254925*16080123452125*i=149251625160849noSwap=10825*4921noSwap=1i=2i=30816noSwap=125*252125*012345i=44916noSwap=0082521voidBubbleSort(SqList&L){//从下往上扫描的起泡排序for(i=0;i<n-2;i++){//做n-1趟排序noSwap=TRUE;//置未交换标志for(j=n-1;j>=i;j--)//从下往上扫描if(L.r[j+1].key<L.r[j].key){ temp=L.r[j+1];//交换记录L.r[j+1]=L.r[j]; L.r[j]=temp; noSwap=FALSE; }if(noSwap)break;//本趟扫描未发生交换,那么终止算法}}起泡排序的算法:算法分析:在记录的初始排列已经按关键字从小到大排好序时,此算法只执行一趟起泡,做n-1次关键字比较,不移动记录。这是最好的情形。
最坏的情形是算法执行了n-1趟起泡,第i趟(1in)做了n-i次关键字比较,执行了n-i次记录交换。这样在最坏情形下总的关键字比较次数KCN和记录移动次数RMN为:起泡排序需要一个附加记录以实现记录值的对换。起泡排序是一个稳定的排序方法。快速排序(QuickSort)根本思想:是任取待排序记录序列中的某个记录(例如取第一个记录)作为基准,按照该记录的关键字大小,将整个记录序列划分为左右两个子序列:左侧子序列中所有记录的关键字都小于或等于基准记录的关键字右侧子序列中所有记录的关键字都大于或等于基准记录的关键字基准记录那么排在这两个子序列中间(这也是该记录最终应安放的位置)。然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。21254925*1608123456pivot1608i=249i=308162525*21212125*i=125164908pivotpivot25*2549pivot算法描述:一趟划分算法:intPartition(SqList&L,intlow,inthigh){L.r[0]=L.r[low];//用子表的第一个记录作基准记录pivotkey=L.r[low].key;//基准记录关键字while(low<high){//从表的两端交替地向中间扫描while(low<high&&L.r[high].key>=pivotkey)high--;L.r[low]=L.r[high];while(low<high&&L.r[low].key<=pivotkey)low++;L.r[high]=L.r[low];}L.r[low]=L.r[0];//基准记录到位returnlow;//返回枢轴位置}
voidQSort(SqList&L,intlow,inthigh){intpivotloc;if(low<high){//长度大于1pivotloc=Partition(L,low,high);QSort(L,low,pivotloc-1);//对低子表递归排序QSort(L,pivotloc+1,high);//对高子表递归排序}}
算法quicksort是一个递归的算法,其递归树如下图。2125*25490816算法partition利用序列第一个记录作为基准,将整个序列划分为左右两个子序列。算法中执行了一个循环,只要是关键字小于基准记录关键字的记录都移到序列左侧,最后基准记录安放到位,函数返回其位置算法分析:从快速排序算法的递归树可知,快速排序的趟数取决于递归树的深度。如果每次划分对基准记录定位后,该记录的左侧子序列与右侧子序列的长度相同,那么下一步将是对两个长度减半的子序列进行排序,这是最理想的情况。在n个元素的序列中,对一个记录定位所需时间为O(n)。假设设T(n)是对n个元素的序列进行排序所需的时间,而且每次对一个记录正确定位后,正好把序列划分为长度相等的两个子序列,此时,总的计算时间为:T(n)n+2T(n/2)//一趟划分比较次数为n-1次n+2(n/2+2T(n/4))=2n+4T(n/4)2n+4(n/4+2T(n/8))=3n+8T(n/8)………nlog2n+nT(1)=O(nlog2n)可以证明,函数quicksort的平均计算时间也是o(nlog2n)。实验结果说明:就平均计算时间而言,快速排序是我们所讨论的所有内排序方法中最好的一个。最坏的情况下:即待排序记录序列已经按其关键字从小到大排好序的情况下,其递归树成为单支树,每次划分只得到一个比上一次少一个记录的子序列。这样,必须经过n-1趟才能把所有记录定位,而且第i趟需要经过n-i次关键字比较才能找到第i个记录的安放位置,总的关键字比较次数将到达:其排序速度退化到简单排序的水平,比直接插入排序还慢。假设能更合理地选择基准记录,使得每次划分所得的两个子序列中的记录个数尽可能地接近,可以加速排序速度,但是由于记录的初始排列次序是随机的,这个要求很难办到。有一种改进方法:取每个待排序记录序列的第一个记录、最后一个记录和位置接近正中的3个记录,取其关键字居中者作为基准记录。用居中关键字记录作为基准记录快速排序是一种不稳定的排序方法。对于n较大的平均情况而言,快速排序是“快速〞的,但是当n很小时,这种排序方法往往比其它简单排序方法还要慢。
08
16212525*49012345pivot21初始
08
16
21
2525*490825*
0816
21
25
25*49i=1i=2根本思想:每一趟(例如第i趟,i=1,2,…,n-1)在后面n-i+1个待排序记录中选出关键字最小的记录,作为有序记录序列的第i个记录。待到第n-1趟作完,待排序记录只剩下1个,就不用再选了。选择排序首先在所有记录中选出关键字最小的记录,把它与第1个记录交换,然后在其余的记录中再选出关键字次最小的记录与第2个记录交换,以次类推……,直到所有记录排序完成。
简单项选择择排序(SelectSort)21254925*1608012345初始2125*i=025164908最小者08交换21,0825160825*4921i=1最小者16交换25,1649i=2081625*2521最小者21交换49,210123454925*i=308162521最小者25*无交换25*i=449最小者25无交换2521160825160825*4921结果各趟排序后的结果01234549160825*49210825*2521i=1时选择排序的过程ikj49250825*1621ikj492525*251625ikj16<2549250825*1621012345ikj2116k指示当前序列中最小者voidSelectSort(SqList&L){inti,j;RedTypetemp;for(i=0;i<L.length-1;i++){//做n-1趟选择排序k=i;//在当前无序区选关键字最小的记录for(j=i+1;j<L.length;j++)if(L.r[j].key<L.r[k].key)k=j;if(k!=i){temp=L.r[i];L.r[i]=L.r[k];L.r[k]=temp;}}}简单项选择择排序的算法:算法分析:
简单项选择择排序的关键字比较次数KCN与记录的初始排列无关。第i趟选择具有最小关键字记录所需的比较次数总是n-i次,此处假定整个待排序记录序列有n个记录。因此,总的关键字比较次数为:记录的移动次数与记录序列的初始排列有关。当这组记录的初始状态是按其关键字从小到大有序的时候,记录的移动次数RMN=0,到达最少。最坏情况是每一趟都要进行交换,总的记录移动次数为RMN=3(n-1)。简单项选择择排序总的时间复杂度是O(n2)简单项选择择排序是一种不稳定的排序方法。堆排序(HeapSort)堆的概念:堆是一个关键字序列{k1,k2,…,kn},它具有如下特性:ki≤k2i或ki≥k2iki≤k2i+1ki≥k2i+1(i=1,2,…,└n/2┘)堆的特性在完全二叉树中解释为:完全二叉树中任一结点的关键字都小于等于〔或大于等于〕它的左、右孩子的关键字。如以下关键字序列均是堆:{5,23,16,68,94,72,71,73}(小顶堆){96,83,27,38,11,9}(大顶堆)由堆定义可知:假设关键字序列{k1,k2,…,kn}是堆,那么堆顶元素是n个元素序列中的最小〔最大〕元素。堆排序根本思想:首先将初始待排序记录序列建堆,那么堆顶元素必为含最大关键字或最小关键字的记录,输出该记录,然后将剩余记录再调整为堆,如此反复,直至排序结束。在堆排序主要需解决两个问题:①如何建堆?
在完全二叉树中,所有序号i>n/2的结点都是叶子,因此,以这些结点为根的子树均已是堆,这样只需将以序号为n/2,
n/2-1,n/2-2,…,1的结点为根的子树都调整为堆即可。在按此次序调整每个结点时,其左、右子树均已是堆。假设ki的左、右子树已经是堆,如何将以ki为根的完全二叉树也调整为堆?因ki的左、右子树已经是堆,所以必须在ki和它的左、右孩子中选出最小〔或最大〕的结点放到ki的位置上,不妨设k2i关键字最小,将ki与k2i交换位置,而交换之后有可能导致以k2i为根的子树不再为堆,于是可重复上述过程,将以k2i为根的子树调整为堆,……,如此逐层下去,最多可能一直调整到树叶,此方法称为“筛选法〞。例子:关键字序列为42,13,91,23,24,16,05,88,n=8,故从第四个结点开始调整4213912324160588421391232416058842139188241605234213918824160523不调整421391882416052342139188241605234288912324160513428891232416051391884223241605139188422324160513建成的堆调整算法:typedefSqListHeapType;voidHeapAdjust(HeapType&H,ints,intm){RedTyperc;rc=H.r[s];for(j=2*s;j<=m;j*=2){//沿key较大的孩子结点向下筛选if(j<m&&H.r[j].key<H.r[j+1].key)j++;if(rc.key>=H.r[j].key)break;//rc应插入在位置s上H.r[s]=H.r[j];s=j;}H.r[s]=rc;}
//H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,本算法调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆.上述算法只是对一个指定的结点进行调整。有了这个算法,那么将初始的无序区R[1]到R[n]建成一个大根堆,可用以下语句实现:for(i=n/2;i>=1;i--)
HeapAdjust(H,i,H.length)基于初始堆进行堆排序大顶堆的第一个记录R[1]具有最大的关键字,将R[1]与R[n]对调,把具有最大关键字的记录交换到最后,再对前面的n-1个记录,使用堆的调整算法HeapAdjust(H,1,n-1),重新建立大顶堆。结果具有次最大关键字的记录又上浮到堆顶,即R[1]位置。再对调R[1]和R[n-1],调用HeapAdjust(H,1,n-2),对前n-2个记录重新调整,…。如此反复执行,最后得到全部排序好的记录序列。这个算法即堆排序算法。91884223241605139188422324160513〔a〕初始堆R[1]到R[8]13884223241605911388422324160591〔b〕第一趟排序之后〔c〕重建的堆R[1]到R[7]8824422313160591882442231316059105244223131688910524422313168891〔d〕第二趟排序之后〔e〕重建的堆R[1]到R[6]42241623130588914224162313058891〔f〕第三趟排序之后05241623134288910524162313428891〔g〕重建的堆R[1]到R[5]24231605134288912423160513428891〔h〕第四趟排序之后13231605244288911323160524428891〔i〕重建的堆R[1]到R[4]23131605244288912313160524428891〔j〕第五趟排序之后05131623244288910513162324428891〔k〕重建的堆R[1]到R[3]16130523244288911613052324428891〔l〕第六趟排序之后05131623244288910513162324428891〔m〕重建的堆R[1]到R[2]13051623244288911305162324428891〔n〕第七趟排序之后05131623244288910513162324428891voidHeapSort(HeapType&H){RedTypetemp;inti;for(i=H.length/2;i>0;i--)//把H.r[1..H.length]建成大顶堆 HeapAdjust(H,i,H.length);for(i=H.length;i>1;i--){ temp=H.r[1]; H.r[1]=H.r[i]; H.r[i]=temp;HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆}}堆排序的算法:算法分析:堆排序的时间主要由建立初始堆和不断重复调整堆这两局部的时间开销构成。假设设堆中有n个结点,且2k-1n2k,那么对应的完全二叉树有k层。在第i层上的结点数2i-1(i=1,2,…,k)。在第一个建立初始堆的for循环中对每一个非叶结点调用了一次堆调整算法HeapAdjust(),因此该循环所用的计算时间为:其中,i是层序号,2i-1是第i层的最大结点数,(k-i)是第i层结点能够移动的最大距离。堆排序过程中进行n-1次重建堆所进行的总比较次数不超过下式:2*(log2(n-1)+log2(n-2)+…+log22)<2nlog2n=O(nlog2n)因此堆排序总的时间复杂度是O(n+nlog2n)=
O(nlog2n)。堆排序在最坏情况下的时间复杂度也是O(nlog2n),相对于快速排序来说,这是堆排序的最大优点。堆排序是一个不稳定的排序方法。归并排序(MergeSort)归并排序是利用“归并〞技术来进行排序,所谓归并是指将两个有序的序列合并形成一个新的有序序列。将待排序记录序列R1,R2,…,Rn看成为n个长度为1的有序子序列,把这些子序列两两进行归并,便得到┌n/2┐个长度为2的有序子序列,然后再两两归并,……,如此重复,直到最后得到一个长度为n的有序记录序列为止,这种方法成为二路归并方法。归并排序过程212525*25*936272083716544921254962930872163754212525*490862729316375408082116252125*254925*623772499354163754627293len=1len=2len=4len=8len=16归并算法://将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]算法voidMerge(RedTypeSR[],RedTypeTR[],inti,intm,intn){intj,k,l;for(j=m+1,k=i;i<=m&&j<=n;++k)if(SR[i].key<=SR[j].key)TR[k]=SR[i++];elseTR[k]=SR[j++];if(i<=m)for(l=0;l<=m-i;l++)TR[k+l]=SR[i+l];//将剩余的SR[i..m]复制到TRif(j<=n)for(l=0;l<=n-j;l++)TR[k+l]=SR[j+l];//将剩余的SR[j..n]复制到TR}一趟归并算法:voidMergePass(RedTypeR[],RedType
R1[],intlength){inti,j;i=0;while(i+2*length-1<n){MERGE(R,R1,i,i+length-1,i+2*length-1);i=i+2*length;}if(i+length-1<n-1)MERGE(R,R1,i,i+length-1,n-1);elsefor(j=i;j<n;j++)R1[j]=R[j];}归并排序算法:voidMergeSort(RedType
R[]){intlength=1;while(length<n){MERGEPASS(R,R1,length);length=2*length;MERGEPASS(R1,R,length);length=2*length;}}
voidMSort(RedTypeSR[],RedTypeTR1[],ints,intt){intm;Re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共安全视频监控管理指南(标准版)
- 互联网金融服务管理办法
- 档案资料管理规范制度
- 房地产租赁合同签订与管理规范(标准版)
- 2025年企业财务管理与核算规范
- 超市消防安全教育制度
- 采购信息网络安全与保密制度
- 办公室员工绩效评估制度
- 上师大附中嘉定新城分校2026学年教师招聘与实习生招募备考题库(第二批次)及完整答案详解一套
- 养老院安全防护制度
- 排矸协议合同范本3篇
- 2024-2025学年江苏省苏州吴中、吴江、相城、高新区初一(上)语文期末试题及答案
- 咨询服务风险管理-洞察阐释
- 航天智能通信原理与应用 课件 第7章 电磁频谱感知
- 护理节前安全教育
- 2025年上半年辽宁大连市总工会面向社会招聘社会化工会工作者42人重点基础提升(共500题)附带答案详解
- 个人委托书范本模板电子版
- 租学位合同协议书
- NB-T32036-2017光伏发电工程达标投产验收规程
- 国有企业采购管理规范 T/CFLP 0027-2020
- 模板-健康风险评估报告
评论
0/150
提交评论