heap.k 793 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. / binary heap
  2. \d hpbn
  3. / shift down
  4. sd:{$[(y<z)&0<c:*>x@i:(z>)#y,-1 0+2*y+1;o[@[x;y,i[c];:;x@i[c],y];i[c];z];x]}
  5. / shift up
  6. su:{$[y&>/v:x@y,s:-2!y-1;o[@[x;s,y;:;v];s];x]}
  7. /heapify
  8. hp:{sd/[x;|:!c:1+-2!-2+#x;#x]}
  9. / heap insert
  10. hi:{su[x,y;#x]}
  11. / max extract
  12. hx:{(*x;sd[(*|x),-1_1_x;0;#x])}
  13. / heap sort
  14. hs:{h:hp@x;*(-1+#x)({(sd[@[x;0,y;:;x@y,0];0;y];y-1)}.)/(h;-1+#x)}
  15. / binomial heap
  16. \d hpbl
  17. / heap insert
  18. hi:{mg@hi0[x;y]}
  19. hi0:{(r;p;d;n):x;(r,#p;p,#p;d,0;n,y)}
  20. / merge heap
  21. mg:{(r;p;d):-1_x
  22. *{$[2>#l:*|x;x
  23. ~=/x[0;2;2#l];x
  24. (cm[*x;2#l];1_l)]}/(x;@/1(<d@)\r)}
  25. / combine (trees)
  26. cm:{(r;p;d;n):x;y:@/1(<n@)\y
  27. r:r_r?y@0;p[y@0]:y@1;d[y@1]+:1
  28. (r;p;d;n)}
  29. / heap extract
  30. hx:{(r;p;d;n):x;m:*>n@r
  31. p:@[p;r@m;:;0N]
  32. p:@[p;c;:;c:&p=r@m]
  33. (n@r@m;mg@(c,r_m;p;d;n))}
  34. \d .