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

十大经典排序算法详解之二希尔排序,归并排序,快速排序

时间:2023-03-19 11:53:03 科技观察

十大经典排序算法详解之二希尔排序、归并排序、快速排序这是之前第一篇文章的链接:十大经典排序算法详解(一)冒泡排序、选择排序、插入排序,有的朋友没看过可以看看。每一个讲解都是“先用文字”来帮助你先熟悉算法的基本思想,然后我会通过“图片法”帮你分析排序算法的动态执行过程,让你可以更好地理解算法。每次对比图片都很繁琐,真的很费时间。所以如果觉得文章还行或者对你有帮助的话,可以选择点三连,或者选择关注我的公众号:“萌萌达的肉”,这个对我来说真的很重要。在此UP谢谢大家。废话不多说,开始我们的正文部分!!!1-希尔排序算法思想:其实希尔排序的思想很简单,因为希尔排序的基本思想就是第一篇中间解释的插入排序的基本思想,“就是这样希尔排序比插入排序多了一步来确定步长”。在插入排序的过程中,我们的步长是固定的,就是1。在希尔排序中,我们的步长是不固定的,“一开始就是数组长度的一半,之后每次分组后步长都会减小并排序Half,直到步长达到1”。这个时候我们的排序就已经完成了。之后我们用图来帮助大家更好的理解希尔排序:看完上图相信大家对希尔排序算法的思想有了基本的了解,那么下面我们来分析一下希尔排序算法的特点:希尔排序算法不稳定,看到这里你可能会有这样的疑问。排序算法的本质是插入排序,只是多了一步来确定步长。为什么插入排序是稳定的,而希尔排序是不稳定的,没有丢失?其实关键在分组之后。大家都知道,在一个分组里面进行插入排序肯定是稳定的。关键是在希尔排序的过程中会出现多次分组,然后会出现上一次分组稳定,下一次分组不稳定的情况。说了这么多,不如直接给大家举个例子,大家就知道了:希尔排序是第一个在时间复杂度上突破O(N*N)的算法,非常有意义。时间复杂度仅为O(N*logN)算法图:这里插入图片来描述示例代码:《一个不根据算法思想改变的版本》:publicstaticvoidmain(String[]args){int[]num={7,4,9,3,2,1,8,6,5,10};longstartTime=System.currentTimeMillis();//指定步长为(intstep=num.length/2;step>0;step/=2){System.out.println("Groupsortingwithstepsize"+step+":");//步长确定后,需要批量插入分组排序for(intl=0;l0&&temp0;step/=2){System.out.println("Groupsortwithstepsize"+step+":");System.out.println("Cyclegroupsort:");对于(整数j=step;j=0&&temp=key){j--;}if(i