ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:914.31KB ,
资源ID:3646620      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3646620.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(常用排序算法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

常用排序算法.docx

1、常用排序算法交换排序冒泡排序将最后一个元素与倒数第二个元素对比,如果最后一个元素比倒数第二个小,则交换两个元素的位置,再用倒数第二个元素与倒数第三个元数对比,直到比到第一个元素,这样经过第一趟排序后得到第一个最小元素。如此反复几过N(N=length-1)次后可得到排序结果。Java代码 1. packagesort;2. 3. importjava.util.Comparator;4. 5. /*6. *冒泡排序算法7. *authorjzj8. *date2009-12-99. *10. *param11. */12. publicclassBubbleSortEextendsCompar

2、ableextendsSort13. 14. /*15. *排序算法的实现,对数组中指定的元素进行排序16. *paramarray待排序的数组17. *paramfrom从哪里开始排序18. *paramend排到哪里19. *paramc比较器20. */21. publicvoidsort(Earray,intfrom,intend,Comparatorc)22. /需array.length-1轮比较23. for(intk=1;k=k;i-)26. /按照一种规则(后面元素不能小于前面元素)排序27. if(pare(arrayi,arrayi-1)0)28. /如果后面元素小于了(

3、当然是大于还是小于要看比较器实现了)前面的元素,则前后交换29. swap(array,i,i-1);30. 31. 32. 33. 34. 35. /*36. *测试37. *paramargs38. */39. publicstaticvoidmain(Stringargs)40. IntegerintgArr=7,2,4,3,12,1,9,6,8,5,11,10;41. BubbleSortsort=newBubbleSort();42. BubbleSort.testSort(sort,intgArr);43. BubbleSort.testSort(sort,null);44. 45

4、. 快速排序快速排序采用了分治法的思想,把大的问题分解为同类型的小问题。一般分如下步骤:1)选择一个中枢元素(有很多选法,我的实现里使用第一个元素为中枢的简单方法)2)以该中枢元素为基准点,将小于中枢的元素放在中枢后集合的前部分,比它大的在集合后部分,待集合基本排序完成后(此时前部分元素小于后部分元素),把中枢元素放在合适的位置。3)根据中枢元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。这里的重点与难点在于第二步,实现的方式有很多种,我这里实现了三种。第一种实现 (partition1方法):以第一个元素为中枢元素,在中枢元素

5、后面集合中从前往后寻找第一个比中枢元素小的元素,并与第一个元素交换,然后从剩余的元素中寻找第二个比中枢元素小的 元素,并与第二位元素交换,这样直到所有小于中枢元素找完为止,并记下最后一次放置小于中枢的元素位置minIndex(即小于中枢与大于中枢的分界), 并将中枢元素与minIndex位置元素互换,然后对中枢元素两边的序列进行同样的操作。此种实现最为简洁,处理过程中不需要把中枢元素移来移去,只是在其它元素完成基本排序后(前部分小于后部分元素)再把中枢元素放置到适当的位置第二种实现 (partition2方法):以第一个元素为中枢元素,刚开始时使用低指针指向中枢元素。当中枢元素在低指针位置时,

6、此时我们判断高指针指向的元素是否小于中枢元素,如果大于中枢元素 则高指针继续向头移动,如果小于则与中枢元素交换,此时中枢元素被移到了高指针位置;当中枢元素在高指针位置时,我们此时判断低指针指向的元素是否大于中 枢元素,如果小于中枢元素则低指针继续向尾移动,如果大于则与中枢元素交换,此时中枢元素又回到了低指针位置;这时是拿高还是低指针所指向的元素与中枢比 较时根据前面逻辑来处理,直到高低指针指向同一位置则完成一轮排序,然后再对中枢元素两边的序列进行同样的操作直到排序完成此种实现逻辑比较好理解,中枢元素的永远在低指针或指针所指向的位置,每次找到需处理的元 素后,要与中枢交换,中枢就像皮球一样从这里

7、踢到那里,又从那里踢到这里。但此种实现会频繁地交换中枢元素,性能可能不如第一种第三种实现 (partition3方法):此种方式与前两种方式不太一样,同时移动高低指针,低指针向尾找出大于等于中枢的元素,而高向头找出小于中枢的元素,待两者都找出后交换高低指针所指向的 元素,直到高低指针指向同一位置止,然后比较中枢与高低指针所指向的元素大小,如果中枢元素大,则直接与高低指针元素交换,如果中枢元素小于等于高低指针 元素,则中枢元素与高低指针前一元素交换,完成一轮比较,然后再对中枢元素两边的序列进行同样的操作直到排序完成此种方式有点难度,在移动元素时要注意的是:与中枢相等的元素也要向集合后部移动,不然

8、的话如3,3,0,3,3第一轮排序结果不准确,虽然最后结果 正确。当中枢后面的元素集合移动完成后,还得要把中枢元素放置在集合中的合适位置,这就需要找准集合中前部分与后部分的边界,最后只能把中枢元素与最后一 个小于中枢的元素进位置互换。但此种实现方式与第一种有点像,也不需要把中枢元素调来调去的,而是待后面集合排序完成后将中枢放入适当位置Java代码 1. packagesort;2. 3. importjava.util.Arrays;4. importjava.util.Comparator;5. 6. /*7. *快速排序算法8. *authorjzj9. *date2009-12-910.

9、 *11. *param12. */13. publicclassQuickSortEextendsComparableextendsSort14. 15. /*16. *排序算法的实现,对数组中指定的元素进行排序17. *paramarray待排序的数组18. *paramfrom从哪里开始排序19. *paramend排到哪里20. *paramc比较器21. */22. publicvoidsort(Earray,intfrom,intend,Comparatorc)23. quickSort(array,from,end,c);24. 25. 26. /*27. *递归快速排序实现28

10、. *paramarray待排序数组29. *paramlow低指针30. *paramhigh高指针31. *paramc比较器32. */33. privatevoidquickSort(Earray,intlow,inthigh,Comparatorc)34. /*35. *如果分区中的低指针小于高指针时循环;如果low=higth说明数组只有一个元素,无需再处理;36. *如果lowhigth,则说明上次枢纽元素的位置pivot就是low或者是higth,此种情况37. *下分区不存,也不需处理38. */39. if(lowhigh)40. /对分区进行排序整理41. intpivo

11、t=partition1(array,low,high,c);42. /*43. *以pivot为边界,把数组分成三部分low,pivot-1、pivot、pivot+1,high44. *其中pivot为枢纽元素,不需处理,再对low,pivot-1与pivot+1,high45. *各自进行分区排序整理与进一步分区46. */47. quickSort(array,low,pivot-1,c);48. quickSort(array,pivot+1,high,c);49. 50. 51. 52. 53. /*54. *实现一55. *56. *paramarray待排序数组57. *par

12、amlow低指针58. *paramhigh高指针59. *paramc比较器60. *returnint调整后中枢位置61. */62. privateintpartition1(Earray,intlow,inthigh,Comparatorc)63. EpivotElem=arraylow;/以第一个元素为中枢元素64. /从前向后依次指向比中枢元素小的元素,刚开始时指向中枢,也是小于与大小中枢的元素的分界点65. intborder=low;66. 67. /*68. *在中枢元素后面的元素中查找小于中枢元素的所有元素,并依次从第二个位置从前往后存放69. *注,这里最好使用i来移动,

13、如果直接移动low的话,最后不知道数组的边界了,但后面需要70. *知道数组的边界71. */72. for(inti=low+1;i=high;i+)73. /如果找到一个比中枢元素小的元素74. if(pare(arrayi,pivotElem)0)75. swap(array,+border,i);/border前移,表示有小于中枢元素的元素76. 77. 78. /*79. *如果border没有移动时说明说明后面的元素都比中枢元素要大,border与low相等,此时是80. *同一位置交换,是否交换都没关系;当border移到了high时说明所有元素都小于中枢元素,此81. *时将中

14、枢元素与最后一个元素交换即可,即low与high进行交换,大的中枢元素移到了序列最82. *后;如果lowminIndexhigh,表明中枢后面的元素前部分小于中枢元素,而后部分大于83. *中枢元素,此时中枢元素与前部分数组中最后一个小于它的元素交换位置,使得中枢元素放置在84. *正确的位置85. */86. swap(array,border,low);87. returnborder;88. 89. 90. /*91. *实现二92. *93. *paramarray待排序数组94. *paramlow待排序区低指针95. *paramhigh待排序区高指针96. *paramc比较器

15、97. *returnint调整后中枢位置98. */99. privateintpartition2(Earray,intlow,inthigh,Comparatorc)100. intpivot=low;/中枢元素位置,我们以第一个元素为中枢元素101. /退出条件这里只可能是low=high102. while(true)103. if(pivot!=high)/如果中枢元素在低指针位置时,我们移动高指针104. /如果高指针元素小于中枢元素时,则与中枢元素交换105. if(pare(arrayhigh,arraypivot)0)115. swap(array,low,pivot);1

16、16. /交换后中枢元素在低指针位置了117. pivot=low;118. else/如果未找到大于中枢元素,则低指针后移继续找119. low+;120. 121. 122. if(low=high)123. break;124. 125. 126. /返回中枢元素所在位置,以便下次分区127. returnpivot;128. 129. 130. /*131. *实现三132. *133. *paramarray待排序数组134. *paramlow待排序区低指针135. *paramhigh待排序区高指针136. *paramc比较器137. *returnint调整后中枢位置138.

17、 */139. privateintpartition3(Earray,intlow,inthigh,Comparatorc)140. intpivot=low;/中枢元素位置,我们以第一个元素为中枢元素141. low+;142. /-调整高低指针所指向的元素顺序,把小于中枢元素的移到前部分,大于中枢元素的移到后面部分143. /退出条件这里只可能是low=high144. 145. while(true)146. /如果高指针未超出低指针147. while(low=0)150. break;151. else/如果低指针指向的元素小于中枢元素时继续找152. low+;153. 154.

18、 155. 156. while(highlow)157. /如果高指针指向的元素小于中枢元素时表示找到,退出158. if(pare(arrayhigh,arraypivot)0)174. /如果退出循环时中枢元素大于了低指针或高指针元素时,中枢元素需与low元素交换175. swap(array,low,pivot);176. pivot=low;177. elseif(pare(arraypivot,arraylow)=0)178. swap(array,low-1,pivot);179. pivot=low-1;180. 181. 182. /返回中枢元素所在位置,以便下次分区183.

19、 returnpivot;184. 185. 186. /*187. *测试188. *paramargs189. */190. publicstaticvoidmain(Stringargs)191. IntegerintgArr=3,1,1,1,1,1,1;192. QuickSortsort=newQuickSort();193. QuickSort.testSort(sort,intgArr);194. QuickSort.testSort(sort,null);195. 196. 归并排序Java代码 1. packagesort;2. 3. importjava.lang.reflect.Array;4. importjava.util.Comparator;5. 6.

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

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