pascal高精度与排序 noip竞赛材料

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

排序排序就是将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程。1.插入排序其核心思想是将一个记录插入到已经排好顺序的有序表中,从而得到一个新的有序表。假设准备排序的记录如下:R(2),R(-1),R(34),R(10),R(45),R(3)经过排序,前三个记录的排序如下R(-1),R(2),R(34)现在需要将第四个记录R(10)插入到当前的序列中。首先确定R(10)在新序列中的位置,其次进行插入操作。假设从左向右排序,则R(10)应当插入到R(2)和R(34)之间构成新的有序序列。R(-1),R(2),R(10),R(34)依次类推完成排序过程。一般描述如下,第i次的插入操作为:在含有i-1个有序子序列R[1,...,i-1]中插入一个记录R[i])后变成含有i个有序子序列R[1,...,i]。为了避免在插入过程中的数组下标越界问题,一般不使用R[0],仅仅作为临时存储区。自i-1记录起向前搜索的过程中,可以同时向后移动记录。描述如下:先将序列看成是一个有序的子序列,然后从第2个记录逐个进行插入,直到整个序列变成按关键字排序的有序序列为止。例:输入序列数据按非减顺序输出.programcrpx;constn=7;vara:array[1..n]ofinteger;i,j,k,t:integer;beginwrite('Enterdate:');fori:=1tondoread(a[i]);writeln;fori:=2tondobegink:=a[i];j:=i-1;while(ka[j])and(j0)dobegina[j+1]:=a[j];j:=j-1end;a[j+1]:=k;end;write('outputdata:');fori:=1tondowrite(a[i]:6);writeln;end.2.快速排序2.1冒泡排序由于此算法中小的数据像水中的气泡一样向上浮动,而大的数据像石头一样沉入水底,因此形象的称此算法为起泡法排序。例:输入序列数据按非减顺序输出。程序1:programmppx;constn=7;vara:array[1..n]ofinteger;i,j,k,t:integer;beginwrite('Enterdate:');fori:=1tondoread(a[i]);fori:=1ton-1doforj:=ndowntoi+1doifa[j-1]a[j]thenbegint:=a[j-1];a[j-1]:=a[j];a[j]:=tend;write('outputdata:');fori:=1tondowrite(a[i]:6);writeln;end.2.2快速排序快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1,处理结束.1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;5)、重复第3、4步,直到I=J;例:输入一组数据小到大排序.程序1:programkspv;constn=7;typearr=array[1..n]ofinteger;vara:arr;i:integer;procedurequicksort(varb:arr;s,t:integer);vari,j,x,t1:integer;begini:=s;j:=t;x:=b[i];repeatwhile(b[j]=x)and(ji)doj:=j-1;ifjithenbegint1:=b[i];b[i]:=b[j];b[j]:=t1;end;while(b[i]=x)and(ij)doi:=i+1;ifijthenbegint1:=b[j];b[j]:=b[i];b[i]:=t1;enduntili=j;b[i]:=x;i:=i+1;j:=j-1;ifsjthenquicksort(b,s,j);ifitthenquicksort(b,i,t);end;beginwrite('inputdata:');fori:=1tondoread(a[i]);writeln;quicksort(a,1,n);write('outputdata:');fori:=1tondowrite(a[i]:6);writeln;end.例如:待排序的数组A的值分别是:(初始关键数据X:=49)A[1]A[2]A[3]A[4]A[5]A[6]A[7]:49386597761327进行第一次交换后:27386597761349(按照算法的第三步从后面开始找进行第二次交换后:27384997761365(按照算法的第四步从前面开始找X的值,6549,两者交换,此时I:=3)进行第三次交换后:27381397764965(按照算法的第五步将又一次执行算法的第三步从后开始找进行第四次交换后:27381349769765(按照算法的第四步从前面开始找大于X的值,9749,两者交换,此时J:=4)此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27381349769765,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列3.选择排序选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最大者与L[1]交换位置,第2遍处理是将L[2..n]中最大者与L[2]交换位置,......,第i遍处理是将L[i..n]中最大者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从大到小的顺序排列好了。例1:输入序列数据按递减顺序输出.程序如下:programxzpx;constn=7;vara:array[1..n]ofinteger;i,j,k,t:integer;beginwrite('Enterdate:');fori:=1tondoread(a[i]);writeln;fori:=1ton-1dobegink:=i;forj:=i+1tondoifa[j]a[k]thenk:=j;ifkithenbegint:=a[i];a[i]:=a[k];a[k]:=t;end;end;write('outputdata:');fori:=1tondowrite(a[i]:6);writeln;end.4归并排序归并就是将多个有序的数列合成一个有序的数列。将两个有序序列合并为一个有序序列叫二路归并(merge).归并排序就是n长度为1的子序列,两两归并最后变为有序的序列。1.二路归并例1:将有序表L1=(1,5,7),L2=(2,3,4,6,8,9,10)合并一个有序表L.programgb;constm=3;n=7;typearrl1=array[1..m]ofinteger;arrl2=array[1..n]ofinteger;arrl=array[1..m+n]ofinteger;vara:arrl1;b:arrl2;c:arrl;i,j,k,r:integer;beginwrite('Enterl1(sorted):');fori:=1tomdoread(a[i]);write('Enterl2(sorted):');fori:=1tondoread(b[i]);i:=1;j:=1;k:=0;while(i=m)and(j=n)dobegink:=k+1;ifa[i]=b[j]thenbeginc[k]:=a[i];i:=i+1;endelsebeginc[k]:=b[j];j:=j+1;end;end;ifi=mthenforr:=itomdoc[m+r]:=a[r];ifj=nthenforr:=jtondoc[n+r]:=b[r];writeln('Outputdata:');fori:=1tom+ndowrite(c[i]:5);writeln;end.2.归并排序programgbpx;constmaxn=7;typearr=array[1..maxn]ofinteger;vara,b,c:arr;i:integer;proceduremerge(r:arr;l,m,n:integer;varr2:arr);vari,j,k,p:integer;begini:=l;j:=m+1;k:=l-1;while(i=m)and(j=n)dobegink:=k+1;ifr[i]=r[j]thenbeginr2[k]:=r[i];i:=i+1endelsebeginr2[k]:=r[j];j:=j+1endend;ifi=mthenforp:=itomdobegink:=k+1;r2[k]:=r[p]end;ifj=nthenforp:=jtondobegink:=k+1;r2[k]:=r[p]end;end;proceduremergesort(varr,r1:arr;s,t:integer);vark:integer;c:arr;beginifs=tthenr1[s]:=r[s]elsebegink:=(s+t)div2;mergesort(r,c,s,k);mergesort(r,c,k+1,t);merge(c,s,k,t,r1)end;end;beginwrite('Enterdata:');fori:=1tomaxndoread(a[i]);mergesort(a,b,1,maxn);fori:=1tomaxndowrite(b[i]:9);writeln;end.例如数组A有7个数据,分别是:49386597761327,那么采用归并排序算法的操作过程如图7所示:初始值[49][38][65][97][76][13][27]看成由长度为1的7个子序列组成第一次合并之后[3849][6597][1376][27]看成由长度为1或2的4个子序列组成第二次合并之后[38496597][132776]看成由长度为4或3的2个子序列组成第三次合并之后[13273849657697]5各种排序算法的比较1.稳定性比较插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的选择排序、希尔排序、快速排序、堆排序是不稳定的2.时间复杂性比较插入排序、冒泡排序、选择排序的时间复杂性为O(n2)其它非线形排序的时间复杂性为O(nlog2n)线形排序的时间复杂性为O(n);3.辅助空间的比较线形排序、二路归并排序的辅助空间为O(n),其它排序的辅助空间为O(1);4.其它比较插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。反而在这种情况下,快速排序反而慢了。当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。宜用归并排序。当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功