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

Java排序算法知多少

时间:2023-03-18 14:49:30 科技观察

Java排序算法你了解多少?读完读者所说的内容,您会立即明白其中的含义。这个感觉有点骗人,其实是面试官想考察你的排序算法的东西,可能真的很无聊。排序算法什么是排序算法?其实也没什么好说的。把意思表达清楚就够了。所谓排序就是一系列的记录,按照一个或几个关键字的大小递增或递减排列。手术。排序算法的种类可以说是比较多样化的。时间和空间的效率,以及不同排序算法的优缺点是不同的。有的以时间换空间,有的以空间换时间。今天阿芬就一一列举。冒泡排序什么是冒泡排序?冒泡排序就是依次比较相邻的两个数,小数在前,大数在后。就好像一个泡泡一样,直接往上飘了起来。冒泡排序就是依次比较相邻的两个数,小数放在前面,大数放在后面。其实比较过程是这样的:第一次比较:先比较第一个和第二个数,小数放在前面,大数放在后面,然后比较第二个和第三个数,小数放在前面,大的数放在后面,然后和末尾比较,这样最大的数放在末尾。第二次比较:先比较第一个和第二个数,小数放在前面,大数放在后面,然后和倒数第二个数比较,然后结束第二次比较,这样最后一个位置的就是最大的,然后倒数第二个位置就是第二大的数。然后一直这样下去,第三次就是取第三个数,然后依次循环,这样大家就可以理解了,假设要排序的序列数为n,需要经过n-1轮,最后完成排序。第一轮比较次数为n-1,以后每轮减1。接下来用代码来实现一下:publicstaticvoidmain(int[]a){inttemp;//需要比较n-1轮for(inti=0;ia[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}}InsertionsortInsertionsorttype更直接的插入排序binaryinsertionsortingHillsorting这些排序方式都是插入排序,我们先来看看直接插入排序:比较过程是这样的,第二个数据在array开始向前比较,也就是一开始比较第二个数和前面的数,满足条件就让他们交换位置。如果给我们一个数组,我们要将它从小到大排序,数组为[3,1,4,6,5,17,12,11]这时候第一步就是比较1和3,如果1小于3,此时,改变1和3的位置,[1,3,4,6,5,17,12,11]。然后用第三个数和第二个比较,匹配则交换,不过这里还要继续比较,也就是分别用4、3、1比较,然后一直重复。直到把所有的数据都整理好,得到我们想要的结果,我们来写个代码看看是什么样子的。publicstaticvoidbasal(int[]array){//从第二项开始if(array==null||array.length<2){return;}for(inti=1;i-1;j--){if(curindex-1;j--){array[j+1]=array[j];}array[index]=cur;}}其中,阿芬使用了系统自带的Arrays,然后进行了二分查找和插入排序。为什么这么用?JDK中提供了Arrays.binarySearch(),该方法的入参需要传入一个有序数组。要实现,为什么不用这个方法呢?如果排序前有两个数是相等的,但是排序结束后,这两个数可能会改变顺序,这就说明排序算法不稳定。这就是大家所说的稳定。既然有这样的不稳定排序,那还需要稳定排序吗?是的,有,那什么是稳定排序呢?是的,大家没有看错,冒泡排序是一种稳定排序,因为冒泡排序只是在相邻元素的大小不满足要求的时候交换位置,不会改变相同元素之间的相对顺序,所以是稳定的排序算法。既然刚才说了这个排序有希尔排序,那我们再来看看希尔排序。希尔排序说实话,阿芬刚开始知道这个排序的时候,就想问问是不是一个叫希尔的人改进的。结果,我发现这是真的。希尔排序,又称((reduceincrementalsort)),得名于1959年D.L.Shell提出,实际上应该叫Shell'sSort。希尔排序是先把整个待排序的记录序列分成几个子序列直接插入和排序,等待整个序列中的记录“基本有序”,然后依次对所有记录进行直接插入排序。其实相当于先进行一个简单的分组,将待排序的数组按照步长间隙进行分组,然后使用直接插入排序的方法对每组的元素进行排序;每次差距减半,循环以上操作;当gap=1时,使用直接插入完成排序。代码实现看起来像这样publicstaticvoidsort(int[]a){intlength=a.length;inth=1;while(h=1;h/=3){for(inti=0;i0;j-=h){if(a[j]