数据结构排序PPT推荐.ppt

上传人:b****1 文档编号:14680496 上传时间:2022-10-23 格式:PPT 页数:118 大小:3.06MB
下载 相关 举报
数据结构排序PPT推荐.ppt_第1页
第1页 / 共118页
数据结构排序PPT推荐.ppt_第2页
第2页 / 共118页
数据结构排序PPT推荐.ppt_第3页
第3页 / 共118页
数据结构排序PPT推荐.ppt_第4页
第4页 / 共118页
数据结构排序PPT推荐.ppt_第5页
第5页 / 共118页
点击查看更多>>
下载资源
资源描述

数据结构排序PPT推荐.ppt

《数据结构排序PPT推荐.ppt》由会员分享,可在线阅读,更多相关《数据结构排序PPT推荐.ppt(118页珍藏版)》请在冰豆网上搜索。

数据结构排序PPT推荐.ppt

,#defineMAXSIZE1000/待排顺序表最大长度,typedefintKeyType;

/关键字类型为整数类型,typedefstructKeyTypekey;

/关键字项InfoTypeotherinfo;

/其它数据项RcdType;

/记录类型,typedefstructRcdTyperMAXSIZE+1;

/r0闲置intlength;

/顺序表长度SqList;

/顺序表类型,1.插入类,将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。

2.交换类,通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。

3.选择类,从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。

4.归并类,通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。

10.2插入排序,插入排序的基本思想是:

每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。

简言之,边插入边排序,保证子序列中随时都是排好序的,有序序列R1.i-1,Ri,无序序列Ri.n,一趟直接插入排序的基本思想:

有序序列R1.i,无序序列Ri+1.n,实现“一趟插入排序”可分三步进行:

3将Ri插入(复制)到Rj+1的位置上。

2将Rj+1.i-1中的所有记录均后移一个位置;

1在R1.i-1中查找Ri的插入位置,R1.j.keyRi.keyRj+1.i-1.key;

直接插入排序(基于顺序查找),表插入排序(基于链表存储),不同的具体实现方法导致不同的算法描述,折半插入排序(基于折半查找),希尔排序(基于逐趟缩小增量),1)直接插入排序,新元素插入到哪里?

例1:

关键字序列T=(13,6,3,31,9,27,5,11),请写出直接插入排序的中间过程序列。

【13】,6,3,31,9,27,5,11【6,13】,3,31,9,27,5,11【3,6,13】,31,9,27,5,11【3,6,13,31】,9,27,5,11【3,6,9,13,31】,27,5,11【3,6,9,13,27,31】,5,11【3,5,6,9,13,27,31】,11【3,5,6,9,11,13,27,31】,在已形成的有序表中线性查找,并在适当位置插入,把原来位置上的元素向后顺移。

最简单的排序法!

一、直接插入排序,利用“顺序查找”实现“在R1.i-1中查找Ri的插入位置”,算法的实现要点:

从Ri-1起向前进行顺序查找,监视哨设置在R0;

R0=Ri;

/设置“哨兵”,循环结束表明Ri的插入位置为j+1,R0,j,Ri,for(j=i-1;

R0.keyRj.key;

-j);

/从后往前找,j=i-1,插入位置,对于在查找过程中找到的那些关键字不小于Ri.key的记录,并在查找的同时实现记录向后移动;

for(j=i-1;

-j)Rj+1=Rj,R0,j,Ri,j=i-1,上述循环结束后可以直接进行“插入”,插入位置,令i=2,3,,n,实现整个序列的排序。

for(i=2;

i=n;

+i)if(Ri.keyRi-1.key)在R1.i-1中查找Ri的插入位置;

插入Ri;

voidInsertionSort(SqList+i)if(L.ri.keyL.ri-1.key)/InsertSort,L.r0=L.ri;

/复制为监视哨for(j=i-1;

L.r0.keyL.rj.key;

-j)L.rj+1=L.rj;

/记录后移L.rj+1=L.r0;

/插入到正确位置,例2:

关键字序列T=(21,25,49,25*,16,08),请写出直接插入排序的具体实现过程。

*表示后一个25,i=1,21,i=2,i=3,i=5,i=4,i=6,25,49,25*,49,16,16,08,49,解:

假设该序列已存入一维数组r7中,将r0作为哨兵(Temp)。

则程序执行过程为:

初态:

16,25,21,16,完成!

时间效率:

因为在最坏情况下,所有元素的比较次数总和为(01n-1)O(n2)。

其他情况下也要考虑移动元素的次数。

故时间复杂度为O(n2)空间效率:

仅占用1个缓冲单元O

(1)算法的稳定性:

因为25*排序后仍然在25的后面稳定,内部排序的时间分析:

实现内部排序的基本操作有两个:

(2)“移动”记录。

(1)“比较”序列中两个关键字的大小;

对于直接插入排序:

最好的情况(关键字在记录序列中顺序有序):

“比较”的次数:

最坏的情况(关键字在记录序列中逆序有序):

0,“移动”的次数:

“移动”的次数:

时间复杂度为O(n2),2)折半插入排序,优点:

比较次数大大减少,全部元素比较次数仅为O(nlog2n)。

时间效率:

虽然比较次数大大减少,可惜移动次数并未减少,所以排序效率仍为O(n2)。

空间效率:

仍为O

(1)稳定性:

稳定,一个的改进方法:

思考:

折半插入排序还可以改进吗?

能否减少移动次数?

既然子表有序且为顺序存储结构,则插入时采用折半查找定可加速。

3)希尔(shell)排序,基本思想:

先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

技巧:

子序列的构成不是简单地“逐段分割”,而是将相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依次取5,3,1),直到dk1为止。

优点:

让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多。

又称缩小增量排序,38,例:

关键字序列T=(49,38,65,97,76,13,27,49*,55,04),请写出希尔排序的具体实现过程(dk=5,3,1)。

第1趟(dk=5),第2趟(dk=3),第3趟(dk=1),49,13,13,49,38,27,65,49*,97,55,76,04,27,38,65,49*,97,55,13,55,76,04,55,13,27,04,27,04,49,49*,49,49*,76,38,76,65,65,97,97,13,27,04,49*,76,97,算法分析:

开始时dk的值较大,子序列中的对象较少,排序速度较快;

随着排序进展,dk值逐渐变小,子序列中对象个数逐渐变多,由于前面工作的基础,大多数对象已基本有序,所以排序速度仍然很快。

ri,时间效率:

空间效率:

O

(1)因为仅占用1个缓冲单元算法的稳定性:

不稳定因为49*排序后却到了49的前面,O(n1.25)O(1.6n1.25)由经验公式得到,10.3交换排序,两两比较待排序记录的关键码,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止。

交换排序的主要算法有:

1)冒泡排序2)快速排序,交换排序的基本思想是:

一、起泡排序,二、一趟快速排序,三、快速排序,四、快速排序的时间分析,一、起泡排序,假设在排序过程中,记录序列R1.n的状态为:

第i趟起泡排序,无序序列R1.n-i+1,有序序列Rn-i+2.n,n-i+1,无序序列R1.n-i,有序序列Rn-i+1.n,比较相邻记录,将关键字最大的记录交换到n-i+1的位置上,1)冒泡排序,基本思路:

每趟不断将记录两两比较,并按“前小后大”(或“前大后小”)规则交换。

每趟结束时,能挤出一个最大值到最后面位置,一旦下趟没有交换发生,还可以提前结束排序。

前提:

顺序存储结构,例:

关键字序列T=(21,25,49,25*,16,08),请写出冒泡排序的具体实现过程。

21,25,49,25*,16,0821,25,25*,16,08,4921,25,16,08,25*,4921,16,08,25,25*,4916,08,21,25,25*,4908,16,21,25,25*,49,初态:

第1趟第2趟第3趟第4趟第5趟,voidBubbleSort(ElemR,intn)while(i1)/while/BubbleSort,i=n;

i=lastExchangeIndex;

/本趟进行过交换的/最后一个记录的位置,if(Rj+1.keyRj.key)Swap(Rj,Rj+1);

lastExchangeIndex=j;

/记下进行交换的记录位置/if,for(j=1;

ji;

j+),lastExchangeIndex=1;

冒泡排序的算法分析,最好情况:

初始排列已经有序,只执行一趟起泡,做n-1次关键码比较,不移动对象。

最坏情形:

初始排列逆序,算法要执行n-1趟起泡,第i趟(1in)做了n-i次关键码比较,执行了n-i次对象交换。

因此:

O(n2)因为要考虑最坏情况空间效率:

O

(1)只在交换时用到一个缓冲单元稳定性:

稳定25和25*在排序前后的次序未改变,时间分析:

只需进行一趟起泡,“比较”的次数:

需进行n-1趟起泡,“比较”的次数:

n-1,冒泡排序的优点:

每一趟整理元素时,不仅可以完全确定一个元素的位置(挤出一个泡到表尾),一旦下趟没有交换发生,还可以提前结束排序。

有没有比冒泡排序更快的算法?

有!

快速排序法全球公认!

因为它每趟都能准确定位不止1个元素!

2)快速排序,从待排序列中任取一个元素(例如取第一个)作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;

然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。

此时便为有序序列了。

基本思想:

优点:

因为每趟可以确定不止一个元素的位置,而且呈指数增加,所以特别快!

顺序存储结构,s,t,low,high,设Rs=52为枢轴,将Rhigh.key和枢轴的关键字进行比较,要求Rhigh.key枢轴的关键字,将Rlow.key和枢轴的关键字进行比较,要求Rlow.key枢轴的关键字,high,23,low,80,high,14,low,52,例如,R0,52,low,high,hig

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1