当前位置: 首页 > 科技观察

常见的初级排序算法,这次全懂了_2

时间:2023-03-17 01:32:26 科技观察

本文转载自微信公众号《内测学习JAVA》,作者Silently9527。转载本文请联系贝塔学习JAVA公众号。本文已收录在Github仓库https://github.com/silently9527/JavaCore程序员常用的IDEA插件:https://github.com/silently9527/ToolsetIdeaPlugin完全开源淘客项目:https://github.com/silently9527/mall-coupons-server前言相信程序员刚接触到的所有算法都会是排序算法,因为排序在数据处理和计算中扮演着重要的角色,而排序算法往往是排序算法的基础其他算法;在本文中,我们将从初级排序算法开始学习算法。排序算法的模板在开始之前,我们先定义一个排序算法的通用模板,在后续的排序算法中都会实现这个模板:array){System.out.print(a+"");}}defaultbooleanless(Comparablea,Comparableb){returna.compareTo(b)<0;}defaultvoidexch(Comparable[]array,inti,intj){Comparabletmp=array[我];array[i]=array[j];array[j]=tmp;}}Comparable:为了让我们实现的排序算法更通用,我们可以对任何对象进行排序,所以我们使用Comparable数组排序:不同的排序算法是以不同的方式实施。子类实现less定义的公共方法:如果a0&&less(array[j],array[j-1]);j--){exch(array,j,j-1);}}}}从代码的实现我们可以看出,当当前索引的元素大于左排序数组的最后一个元素时,内层循环会直接结束,所以我们排序的数组是有偏序的,那么插入排序算法会很快。考虑到最坏的情况,如果输入数组是倒排的,那么插入排序的效率和选择排序是一样的,“时间复杂度是O(n2)”希尔排序对于大规模的倒排排序是很慢的-order数组插入排序,是因为它只交换相邻的元素,元素只能一点一点地从数组中移到正确的位置;插入排序对于部分有序数组的排序非常有效;希尔排序就是根据这两个特点对插入排序进行了改进;算法的思路是先设定一个步长h来分离子数组,使用插入排序对h个子数组独立排序。减小h步长,继续对子数组进行排序,直到h步长为1。当步长为1时,就变成了普通的插入排序,所以数组一定是有序希尔排序高效的原因。开始排序时,每个子数组都很短,子数组排序后,是偏序的。这两种情况都适用于插入排序。代码实现:publicclassShellSortimplementsSortTemplate{@Overridepublicvoidsort(Comparable[]array){intgap=1;intlength=array.length;while(gap=1){for(inti=gap;i=gap&&less(array[j],array[j-gap]);j-=gap){exch(array,j,j-差距);}}差距=差距/3;}}}