java堆排序算法代码,堆排序实现代码

  java堆排序算法代码,堆排序实现代码

  本文主要以图片的形式讲解堆排序过程,然后用Java代码实现堆排序并分析时间复杂度,具有一定的参考价值。感兴趣的朋友可以了解一下。

  1.导言2。图形堆排序3。java代码实现和时间复杂度分析4。总结。

  

一、引言

  优先级队列可以在O(NlogN)时间内进行排序,就像上一篇文章中解决topK问题所用的思路一样,这个思路就是堆排序。

  字体这里有一个窍门。如果用新数组存储,需要O(N)空间;但是每次deleteMax都会空一个位置,把末尾的节点过滤下来,那么我们就可以把deleteMax的数据放在末尾。算法思想:通过将数组元素进行buildHeap进行堆序化(构建大顶堆);再对堆进行N-1次deleteMax操作。如果你对二进制堆一无所知,可以看看图示的优先级队列(heap)。

  

二、图解堆排序(heapsort)

  我们从数组下标0开始,不像二进制堆从数组下标1开始。

  堆排序过程:

  公共类堆排序{

  公共静态void main(String[] args) {

  Integer[]整数={7,1,13,9,11,5,8 };

  System.out.println(原始序列: arrays . tostring(integers));

  heapsort(整数);

  System.out.println(排序后: arrays . tostring(integers));

  }

  公共静态T扩展可比?super T void heapsort(T[] a) {

  if (null==a a.length==0) {

  引发新的RuntimeException(“数组为null或长度为0”);

  }

  //生成堆

  for(int I=a . length/2-1;I=0;我- ) {

  percDown(a,I,a . length);

  }

  //deleteMax

  for(int I=a . length-1;I 0;我- ) {

  swapReferences(a,0,I);

  percDown(a,0,I);

  }

  }

  /**

  *向下过滤的方法

  *

  * @param a:要排序的数组

  * @param i:从哪个索引开始过滤?

  * @param n:二进制堆的逻辑大小

  * @param T

  */

  私有静态T扩展可比?super T void percDown(T[] a,int i,int n) {

  int child

  T tmp

  for(tmp=a[I];左孩子;i=儿童){

  child=left child(I);

  如果(孩子!=n - 1 a【子】。compare to(a[child 1])0 {

  孩子;

  }

  if (tmp.compareTo(a[child]) 0) {

  a[I]=a[child];

  }否则{

  打破;

  }

  }

  a[I]=tmp;

  }

  private static int left child(int I){

  返回2 * I 1;

  }

  /**

  *交换数组中两个位置的元素

  *

  * @param a:目标数组

  * @param index1:第一个元素的下标

  * @param index2:第二个元素下标

  * @param T

  */

  private static T void swa preferences(T[]a,int index1,int index2) {

  t tmp=a[index 1];

  a[索引1]=a[索引2];

  a[index 2]=tmp;

  }

  }

  //输出结果

  //原序列:[7,1,13,9,11,5,8]

  //排序后:[1,5,7,8,9,11,13]代码实现构建堆使用O(N)的时间。向下筛选元素需要O(logN),需要N-1次,所以总共需要O (n (n-1) logn)=

  时间复杂度:用自己的存储,无疑是O(NlogN)。

  

三、java代码实现及时间复杂度分析

  这篇文章通过绘图演示了堆排序的过程。很清楚稳定在O(NlogN)。是Java学习的堆排序流程图和代码讲解的详细内容。更多请关注其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: