8种排序之间的关系

上传人:大米 文档编号:508189400 上传时间:2022-10-31 格式:DOCX 页数:20 大小:293.97KB
返回 下载 相关 举报
8种排序之间的关系_第1页
第1页 / 共20页
8种排序之间的关系_第2页
第2页 / 共20页
8种排序之间的关系_第3页
第3页 / 共20页
8种排序之间的关系_第4页
第4页 / 共20页
8种排序之间的关系_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《8种排序之间的关系》由会员分享,可在线阅读,更多相关《8种排序之间的关系(20页珍藏版)》请在金锄头文库上搜索。

1、8种排序之间的关系:选择排序N肖按插入扑序希尔排序简单选择排序堆排序胃泡排序快速排序归并排序基数排序1, 直接插入排序(1) 基本思想:在要排序的一组数中,假设前面(n-1)n=2个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。(2) 实例初始状态5768595257碍59526857,不处理GIIO57685952丨丨575&68.插在57之后57596852丨丨52571插在硏之前结果,52575968(3)用java实现01packagecom.njue;0203publicclassinsertSort04publi

2、cinsertSort()0inta=49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,517,18,23,34,15,35,25,53,51;inttemp=0;07for(inti=1;i=0&tempaj;j-)11 aj+1=aj;11一个单位12 13 aj+1=temp;14 15 for(inti=0;ia.length;i+)16 System.out.println(ai);17182, 希尔排序(最小增量排序)(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下

3、标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。(2)实例:2419=12=3取奇数24283352575968729657685952722896332419啓57%59护683324di=n/2=5193328595272685796da=d2/2=1取奇数(3)用java实现01publicclassshellSort02publicshellSort()03inta=1,54,6,3,78,34,12,45,56,100;04doubled1=a.length;05int

4、temp=0;06while(true)07d1=Math.ceil(d1/2);08intd=(int)d1;09for(intx=0;xd;x+)10for(inti=x+d;i=0&tempaj;j-=d)14 aj+d=aj;15 16 aj+d=temp;1718 19 if(d=1)20 break;21 22 for(inti=0;ia.length;i+)23 System.out.println(ai);24253. 简单选择排序(1) 基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数

5、和最后个数比较为止。(2) 实例:初始状态57685952O最小值为5乙与第一个交换52685957最小值为5人与第二个交换525计5968別就是最小值,无需交换完成52575968(3) 用java实现01publicclassselectSort02publicselectSort()03inta=1,54,6,3,78,34,12,45;04intposition=0;05for(inti=0;ia.length;i+)0607intj=i+1;08091011position=i;inttemp=ai;for(;ja.length;j+)if(ajtemp)12131415161718

6、temp=aj;position=j;aposition=ai;ai=temp;19for(inti=0;i=h2i,hi=2i+1)或(hiv=h2i,hiv=2i+1)(i=1,2,.,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对

7、它们作交换,最后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。(2) 实例:初始序列:46,79,56,38,40,84建堆:046,0506070809101112131415;71617181920212223242526272829303132(3)用java实现01importjava.util.Arrays;023publicclassHeapSort3inta=49,38,65,97,76,13,27,49,78,34,12,64,5,4

8、,62,99,98,54,517,18,23,34,15,35,25,53,51;publicHeapSort()heapSort(a);publicvoidheapSort(inta)System.out.println(开始排序);intarrayLength=a.length;/循环建堆for(inti=0;i=0;i-)/k保存正在判断的节点intk=i;/如果当前k节点的子节点存在while(k*2+1=lastIndex)/k节点的左子节点的索引intbiggerIndex=2*k+1;/如果biggerlndex小于lastlndex,即biggerlndex+l代表的k节点的右

9、子节点存在if(biggerIndexlastIndex)/若果右子节点的值较大if(databiggerIndexdatabiggerIndex+1)/biggerIndex总是记录较大子节点的索引biggerIndex+;/如果k节点的值小于其较大的子节点的值if(datakdatabiggerIndex)/交换他们swap(data,k,biggerIndex);/将biggerlndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值k=biggerIndex;elsebreak;5. 冒泡排序(1) 基本思想:在要排序的一组数中,对当前还未排好序的范围内

10、的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。3334353637383940414243444546474849505152535455565758(2)实例:初始狀态5768595257685952j576852595752685952576859t152576859521575968525:(5968(3)用java实现01publicclassbubbleSort02publicbubbleSort()0inta=49,38,65,97,76,13,27,49,78,34,12,

11、64,5,4,62,99,98,54,53 6,17,18,23,34,15,35,25,53,51;inttemp=0;05for(inti=0;ia.length-1;i+)06for(intj=0;jaj+1)temp=aj;aj=aj+1;aj+1=temp;13 14 for(inti=0;ia.length;i+)15 System.out.println(ai);16176. 快速排序(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 商业计划书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号