Advertisement
Guest User

heap.nim

a guest
Dec 23rd, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.39 KB | None | 0 0
  1. import system,random
  2. discard """ヒープソート
  3. 最大ヒープ、親より大きな子孫は存在しない
  4. """
  5.  
  6. proc build(arr:var seq[int]):void
  7. proc debuild(arr:var seq[int]):void
  8. proc getLeftChild(index:int):int
  9. proc getRightChild(index:int):int
  10. proc getParent(index:int):int
  11.  
  12. var
  13.   testdata:seq[int]
  14. testdata= newseq[int](0)
  15. for i in 0..1000:
  16.   testdata.add(i)
  17. randomize()
  18. for i in 0..1000:
  19.   swap(testdata[i],testdata[i+rand(max=1000-i)])
  20.  
  21. build(testdata)
  22. echo testdata
  23. debuild(testdata)
  24. echo testdata
  25.  
  26. proc build(arr:var seq[int]):void=
  27.   for i,j in arr:
  28.     var a=i
  29.     while arr[getParent(a)]<j:
  30.       swap(arr[getParent(a)],arr[a])
  31.       a=getParent(a)
  32.  
  33. proc debuild(arr:var seq[int]):void=
  34.   let l:int=arr.len
  35.   for i,j in arr:
  36.     if i==l-1:
  37.       break
  38.     swap(arr[0],arr[l-i-1])
  39. #    echo "before:", arr
  40.     var
  41.       a=0
  42.       c:int
  43.     while true:
  44.       c=getRightChild(a)
  45.       if(c>=l-i-1):
  46.         break
  47.       if arr[c]<arr[c-1]:
  48.         c-=1
  49. #      echo "compare arr[a]<=>arr[c]:"& $arr[a]& "," & $arr[c]
  50.       if arr[a]<arr[c]:
  51.         swap(arr[a],arr[c])
  52.         a=c
  53.       else:
  54.         break
  55. #    echo "after:", arr
  56.  
  57.  
  58. proc getParent(index:int):int=
  59.   result=index
  60.   if result!=0:
  61.     result=(result-1) div 2
  62.  
  63. proc getRightChild(index:int):int=
  64.   return (index+1)*2
  65.  
  66. proc getLeftChild(index:int):int=
  67.   return getRightChild(index)-1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement