当前位置:   article > 正文

优先队列(堆)的构建时间复杂度分析_优先队列的时间复杂度

优先队列的时间复杂度

本文以最小堆为例,构建堆的过程是首先初始化一个数组a,其中a[0]存数组的长度n,即第一个有效元素从a[1]开始,这样保证左孩子为2*i,右孩子为2*I+1;然后从(n - 1)/2开始,每次向下调整一个元素,直到n = 0。


代码为:

  1. //最小堆
  2. void HeapAdjust(int *a,int i)
  3. {
  4. int n = a[0];
  5. int child;
  6. int p = a[i];
  7. for(;2 * i <= n; i = child)
  8. {
  9. child = 2 * i;
  10. if( child + 1 <= n && a[child] > a[child + 1])
  11. child++;
  12. if(p > a[child])
  13. a[i] = a[child];
  14. else
  15. break;
  16. }
  17. a[i] = p;
  18. }
  19. void HeapSort(int *a)
  20. {
  21. int n = a[0];
  22. for(int i = (n - 1)>>1;i > 0;i--)
  23. HeapAdjust(a,i);
  24. }


下面分析时间复杂度

n个结点的完全二叉树(堆是完全二叉树)的深度为h(根的深度为1),则h和n之间满足 2^(h-2) <n <= 2^h,h近似等于log(n)+1。

从代码的直观来看,每次调整一个结点需要log(n),一共调整(n-1)/2个结点,故时间复杂度为O(nlogn),但要注意在中间过程中第s层的结点往

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号