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

    复杂选择排序(Selection sort)是一种复杂直观的排序算法。它的任务原理:首先在未排序序列中找到最小(大)元素,寄存到排序序列的起始位置,然后,再从剩余未排序元素中继续寻觅最小(大)元素,然后放到 「已排序序列的末尾」 。以此类推,直到一切元素均排序终了。 

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


    实现代码为:

    public void selectSort(int[] arr) { 

      for (int i = 0; i < arr.length - 1; i++) { 

        int min = i; // 最小位置 

        for (int j = i + 1; j < arr.length; j++) { 

          if (arr[j] < arr[min]) { 

            min = j; // 改换最小位置 

          } 

        } 

        if (min != i) { 

          swap(arr, i, min); // 与第i个位置停止交流 

        } 

      } 

    private void swap(int[] arr, int i, int j) { 

      int temp = arr[i]; 

      arr[i] = arr[j]; 

      arr[j] = temp; 

    关于堆排序,首先是树立在堆的基础上,堆是一棵完全二叉树,还要先看法下大根堆和小根堆,完全二叉树中一切节点均大于(或小于)它的孩子节点,所以这里就分为两种状况

    假设一切节点 「大于」 孩子节点值,那么这个堆叫做 「大根堆」 ,堆的最大值在根节点。

    假设一切节点 「小于」 孩子节点值,那么这个堆叫做 「小根堆」 ,堆的最小值在根节点。 

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


    堆排序首先就是 「建堆」 ,然后再是调整。关于二叉树(数组表示),我们从下往上停止调整,从 「第一个非叶子节点」 末尾向前调整,关于调整的规则如下:

    建堆是一个O(n)的时间复杂度进程,建堆完成后就需求停止删除头排序。给定数组建堆(creatHeap)

    ①从第一个非叶子节点末尾判别交流下移(shiftDown),使妥以后节点和子孩子可以保持堆的性质

    ②但是普通节点交流能够没成绩,对假设交流打破子孩子堆结构性质,那么就要重新下移(shiftDown)被交流的节点不断到中止。 

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


    堆结构完成,取第一个堆顶元素为最小(最大),剩下左右孩子依然满足堆的性值,但是缺个堆顶元素,假设给孩子调下去,能够会调动太多并且能够破坏堆结构。

    ①所以索性把最后一个元素放到第一位。这样只需求判别交流下移(shiftDown),不过需求留意此时整个堆的大小曾经发作了变化,我们在逻辑上不会运用被丢弃的位置,所以在设计函数的时分需求附带一个堆大小的参数。

    ②重复以上操作,不断堆中一切元素都被取得中止。 

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


    而堆算法复杂度的剖析上,之前建堆时间复杂度是O(n)。而每次删除堆顶然后需求向下交流,每个个数最坏为logn个。这样复杂度就为O(nlogn).总的时间复杂度为O(n)+O(nlogn)=O(nlogn).

    实现代码为:

    static void swap(int arr[],int m,int n) 

      int team=arr[m]; 

      arr[m]=arr[n]; 

      arr[n]=team; 

    //下移交流 把以后节点有效变换成一个堆(小根) 

    static void shiftDown(int arr[],int index,int len)//0 号位置不用 

      int leftchild=index*2+1;//左孩子 

      int rightchild=index*2+2;//右孩子 

      if(leftchild>=len) 

        return

    (责任编辑:admin)