您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    面试前必看的十大排序算法
    时间:2021-08-25 12:03 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    面试前必看的十大排序算法

    绪论

    身为顺序员,十大排序是是一切合格顺序员所必备和掌握的,并且抢手的算法比如快排、归并排序还能够问的比较细致,对算法功用和复杂度的掌握有要求。bigsai作为一个担任任的Java和数据结构与算法方向的小博主,在这方面一定不能让读者们有所破绽。跟着本篇走,带你捋一捋常见的十大排序算法,悄然松松掌握!

    首先关于排序来说大少数人对排序的概念停留在冒泡排序或许JDK中的Arrays.sort(),手写各种排序对很多人来说都是一种奢望,更别说十大排序算法了,不过还好你遇到了本篇文章!

    关于排序的分类,主要不同的维度比如复杂度来分、内外部、比较非比较等维度来分类。我们正常讲的十大排序算法是外部排序,我们更多将他们分为两大类:基于 「比较和非比较」 这个维度去分排序种类。

    「非比较类的有桶排序、基数排序、计数排序」。也有很多人将排序归结为8大排序,那就是由于基数排序、计数排序是树立在桶排序之上或许是一种特殊的桶排序,但是基数排序和计数排序有它特有的特征,所以在这里就将他们归结为10种经典排序算法。而比较类排序也可分为

    比较类排序也有更细致的分法,有基于交流的、基于插入的、基于选择的、基于归并的,更细致的可以看下面的脑图。 

    面试前必看的十大排序算法

    冒泡排序

    冒泡排序,又称起泡排序,它是一种基于交流的排序典型,也是快排思想的基础,冒泡排序是一种波动排序算法,时间复杂度为O(n^2).基本思想是: 「循环遍历屡次每次从前往后把大元素往后调,每次确定一个最大(最小)元素,屡次后到达排序序列。」 (或许从后向前把小元素往前调)。

    详细思想为(把大元素往后调):

    从第一个元素末尾往后遍历,每到一个位置判别能否比前面的元素大,假设比前面元素大,那么就交流两者大小,然后继续向后,这样的话停止一轮之后就可以保证 「最大的那个数被交流交流到最末的位置可以确定」 。

    第二次异样从末尾起向后判别着行进,假设以后位置比前面一个位置更大的那么就和他前面的那个数交流。但是有点留意的是,这次并不需求判别到最后,只需求判别到倒数第二个位置就行(由于第一次我们曾经确定最大的在倒数第一,这次的目的是确定倒数第二)

    同理,前面的遍历长度每次减一,直到第一个元素使得整个元素有序。

    例如 2 5 3 1 4 排序进程如下: 

    p style="text-align: center;">

    面试前必看的十大排序算法

    p>实现代码为:

    public void  maopaosort(int[] a) { 

      // TODO Auto-generated method stub 

      for(int i=a.length-1;i>=0;i--) 

      { 

        for(int j=0;j<i;j++) 

        { 

          if(a[j]>a[j+1]) 

          { 

            int team=a[j]; 

            a[j]=a[j+1]; 

            a[j+1]=team; 

          } 

        } 

      } 

    快速排序

    快速排序是对冒泡排序的一种改良,采用递归分治的办法停止求解。而快排相比冒泡是一种不波动排序,时间复杂度最坏是O(n^2),平均时间复杂度为O(nlogn),最好状况的时间复杂度为O(nlogn)。

    关于快排来说, 「基本思想」 是这样的

    快排需求将序列变成两个部分,就是 「序列左边全部小于一个数」 , 「序列左面全部大于一个数」 ,然后应用递归的思想再将左序列当成一个残缺的序列再停止排序,异样把序列的右侧也当成一个残缺的序列停止排序。

    其中这个数在这个序列中是可以随机取的,可以取最左边,可以取最左边,当然也可以取随机数。但是 「通常」 不优化状况我们取最左边的那个数。 

    面试前必看的十大排序算法


    实现代码为:

    public void quicksort(int [] a,int left,int right) 

      int low=left; 

      int high=right; 

      //下面两句的顺序一定不能混,否则会产生数组越界!!!very important!!! 

      if(low>high)//作为判别能否截止条件 

        return

      int k=a[low];//额外空间k,取最左侧的一个作为权衡,最后要求左侧都比它小,右侧都比它大。 

      while(low<high)//这一轮要求把左侧小于a[low],右侧大于a[low]。 

      { 

        while(low<high&&a[high]>=k)//右侧找到第一个小于k的中止 

        { 

          high--; 

        } 

        //这样就找到第一个比它小的了 

        a[low]=a[high];//放到low位置 

        while(low<high&&a[low]<=k)//在low往右找到第一个大于k的,放到右侧a[high]位置 

        { 

          low++; 

        } 

        a[high]=a[low];    

      } 

      a[low]=k;//赋值然后左右递归分治求之 

      quicksort(a, left, low-1); 

      quicksort(a, low+1, right);   

    插入类排序 直接插入排序 (责任编辑:admin)