数据结构讲义第章-排序PPT文件格式下载.ppt
《数据结构讲义第章-排序PPT文件格式下载.ppt》由会员分享,可在线阅读,更多相关《数据结构讲义第章-排序PPT文件格式下载.ppt(81页珍藏版)》请在冰豆网上搜索。
i)比较关键码大小ii)移动记录,(5)对于待排序的记录序列,有三种常见的存储表示方法。
向量结构,即将待排序的记录存放在一组地址连续的存储单元中。
链表结构。
记录向量与地址向量结合,即将待排序记录存放在一组地址连续的存储单元中,同时另设一个指示各个记录位置的地址向量。
10.1概述,1.排序的定义为简单起见,数据的存储结构采取向量的存储结构:
#definen20/记录数typedefintkeytype;
typedefstructkeytypekey;
datatypeother;
rectype;
rectypern+1;
10.1概述,1.排序的定义(6)排序算法的评价:
i)算法的执行时间ii)算法执行时所需的附加空间,10.2插入排序,基本原理:
每步将一个待排序的对象,按其关键字大小,插入到前面已经排好序的一组对象适当位置上,直到对象全部插入为止。
10.2插入排序,10.2.1直接插入排序1、直接插入排序的基本思想先假定第1个记录为有序序列,然后从第2条记录开始,依次将记录插入到前面已经有序的序列中,直至全部记录有序。
一般情况下,第i趟直接插入排序:
将ri插入到已经有序的序列r1.i-1中,使其变成有序序列r1.i。
整个排序进行n-1趟插入。
10.2插入排序,10.2.1直接插入排序2、示例:
初始:
4938659776132749,i=1:
3849659776132749,i=5:
1338496576972749,i=3:
3849659776132749,i=2:
3849659776132749,i=4:
3849657697132749,i=6:
1327384965769749,i=7:
1327384949657697,10.2插入排序,10.2.1直接插入排序3、算法:
voidInsertSort(rectypeR,intn)inti,j;
for(i=2;
in;
i+)R0Ri;
for(ji-1;
R0.keyRj.key;
j-)Rj+1Rj;
Rj+1R0,10.2插入排序,10.2.1直接插入排序4、算法分析:
空间效率:
只需要一个记录的辅助空间。
时间效率:
比较记录的次数为:
最小:
n-1次;
最大:
(n+2)(n-1)/2次移动记录的次数:
2(n-1)最大:
(n+4)(n-1)/2平均情况:
O(n2),10.2插入排序,10.2.2折半插入排序1、折半插入排序:
将直接插入排序的查找过程改用折半查找。
由此实现的排序称为二分法插入排序。
10.2插入排序,10.2.2折半插入排序2、示例:
(1)1327384965769749low=1mid=4high=7
(2)1327384965769749low=5mid=6high=7(3)1327384965769749low=5mid=5high=549high已找到插入位置low=5(4)1327384949657697,10.2插入排序,10.2.2折半插入排序3、算法:
voidBinInsertSort(rectyper,intn)for(i=2;
i=low;
-j)rj+1=rj;
/*记录后移*/rlow=x;
/*插入记录*/,10.2插入排序,10.2.2折半插入排序4、算法分析:
算法分析:
同直接插入排序时间效率:
比较次数确定:
nlog2inlog2ni=1移动记录次数:
平均移动次数为O(n2)时间复杂度为O(n2),10.2插入排序,10.2.3希尔排序(ShellsSort)1、希尔排序:
shell排序又称缩小增量排序(DiminishingIncrementSort)。
先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序“时,再对全体记录进行一次直接插入排序,就可以完成整个的排序工作。
利用下面两点:
当n很小时,直接插入排序的效率较高;
当待排记录序列基本有序时,直接插入排序的效率也较高。
shell排序对直接插入排序算法进行改进。
10.2插入排序,10.2.3希尔排序(ShellsSort)2、示例:
原始序列49386597137627491.d=42.d=213382749497665973.d=11338274949766597排序结果1327384949657697,10.2插入排序,10.2.3希尔排序(ShellsSort)3、算法:
voidshellSort(rectyper,intn,intd,intk)for(l=0;
l0,10.2插入排序,10.2.3希尔排序(ShellsSort)4、算法分析:
Shell排序的平均比较次数和平均移动次数都为O(n1.3)左右Shell排序算法中增加了一个辅助空间。
Shell排序是不稳定的。
10.3交换排序,交换排序基本思想:
两两比较待排序记录的排序码,交换不满足排序要求的偶对,直到全部有序。
10.3交换排序,10.3.1冒泡排序(BubbleSort)1、基本思想:
设待排序记录顺序存放在R1,R2,R3,Rn中:
依次比较(R1,R2),(R2,R3),(Rn-1,Rn),不满足顺序则交换,结果,最大者在Rn中。
这叫一次起泡。
此后,再对存放在R1,R2,R3,Rn-1中n-1个记录作同样处理,结果,最大者在Rn-1中。
n-1次起泡能完成排序。
设置标志noswap表示本次起泡是否有交换,若无交换,表示排序完成。
10.3交换排序,10.3.1冒泡排序(BubbleSort)2、示例:
3849657613274997,4938659776132749,3849651327497697,3849132749657697,3813274949657697,1327384949657697,1327384949657697,初始123456,10.3交换排序,10.3.1冒泡排序(BubbleSort)3、算法:
voidbubbleSort(rectypeR,intn)i=1;
flag=1;
for(i=1;
iRj+1.key)tempRj+1;
Rj+1=Rj;
Rjtemp;
flag1;
10.3交换排序,10.3.1冒泡排序(BubbleSort)4、算法分析:
起泡排序的最坏时间复杂度为O(n2),平均时间复杂度为O(n2)。
起泡排序算法中增加一个辅助空间temp,辅助空间为S(n)=O
(1)。
起泡排序是稳定的。
10.3交换排序,10.3.2快速排序(QuickSort)1、基本思想:
快速排序的基本思想是:
从待排序记录序列中选取一个记录(通常选取第一个记录)作为“枢轴”,通过一趟排序(一次划分)将待排记录分割成独立的两部分,其中一部分记录的关键字比枢轴小,另一部分记录的关键字比枢轴大。
然后则可分别对这两部分记录继续进行划分,以达到整个序列有序。
一趟快速排序(一次划分)的具体做法是:
附设两个指针low和high,它们的初值分别是一个序列的第一个和最后一个记录的位置,设枢轴记录的关键字为pivotKey,在首先从high所指位置起向前搜索直到第一个关键字小于pivotKey的记录和枢轴记录交换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotKey的记录和枢轴记录互相交换,重复交替这两步直到low=high为止。
10.3交换排序,10.3.2快速排序(QuickSort)2、示例:
设记录的关键码序列为:
4938659776132749对其进行快速排序。
10.3交换排序,10.3.2快速排序(QuickSort)3、算法:
intPartition(rectypeR,intn,intlow,inthigh)pivotkey=Rlow.key;
while(low=pivotkey)-high;
rlow=rhigh;
while(lowhigh),10.3交换排序,10.3.2快速排序(QuickSort)3、算法:
voidQSort(rectypeR,intn,intlow,inthigh)if(lowhigh)pivotloc=Partition(R,n,low,high);
QSort(R,low,pivotloc-1);
QSort(R,pivotloc+1,high);
voidQuickSort(rectypeR,intn)QSort(R,n,1,n);
10.3交换排序,10.3.2快速排序(QuickSort)4、算法分析:
最坏情况下,即当初始序列已经有序时,快速排序退化为起泡排序,为O(n2)。
最好时间复杂度为O(nlog2n)。
平均时间复杂度是T(n)=O(nlog2n)。
算法需要一个栈空间实现递归。
栈的大小取决于递归调用的深度,最多不超过n,理想情况下不超过log2n。
所以快速排序的辅助空间最坏为S(n)=O(n),最好为S(n)=O(log2n)。
快速排序是不稳定的。
10.4选择排序,选择排序(SelectionSort)的基本思想是:
每一趟在n-i+1(i=1,2,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
10.4选择排序,10.4.1简单选择排序(SimpleSelectionSort)1、基本思想:
第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。
共需进行i-1趟比较,直到所有记录排序完成为止。
10.4选择排序,10.4.1简单选择排序(SimpleSelectionSort)2、示例:
4938659749132776,1338659749492776,1327659749493876,1327389749496576,1327384997496576,1327384949