• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

heap sort by ruby

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

代码

#heap_sort.rb

def max_heap? array

  (array.size-1).downto(1) do |i|
    parent = (i-1)/2
    return false if array[parent] < array[i]
  end
  true
end

def max_heap_unshift_down array, tail
  i = tail
  while i > 0
    parent = (i-1)/2
    if  array[parent] < array[i]
       array[i], array[parent] = array[parent], array[i]
       i = parent
    else
      break
    end
  end
end

def max_heap_shift_up array, tail
  array[0], array[tail] = array[tail], array[0]
  tail = tail-1
  i = 0;
  while true
    next_i = i
    left_child = 2*i+1
    right_child = 2*i+2
    if right_child <=tail and array[left_child] < array[right_child]
      next_i = right_child
    elsif left_child <=tail
      next_i = left_child
    end

    if i < next_i and array[i] < array[next_i]
      array[i], array[next_i] = array[next_i], array[i]
      i = next_i
    else
      break
    end
  end
end

def heap_sort array
  last = array.size-1
  1.upto(last) do |tail|
    max_heap_unshift_down array, tail
  end
 
  last.downto(0) do |tail|
    max_heap_shift_up array, tail
  end
  array

end

 

测试

#heap_sort_spec.rb

require 'heap_sort'

describe "heap_sort" do
  it "should max_heap? [5, 4, 3, 2,1]" do
    a = [5, 4, 3, 2, 1]
    max_heap?(a).should == true
  end
 
  it "should heap_shift_up [5,4,3,2,1]" do
    a = [5,4,3,2,1]
    max_heap_shift_up a, a.size-1
    max_heap?(a[0, a.size-1]).should== true
  end
 
  it "should heap_unshift_down [4,3,2,1,5]" do
    a = [4,3,2,1,5]
    max_heap_unshift_down a,a.size-1
    max_heap?(a).should== true
  end

  it "should sort [1002,43, 12, 46]" do
    a=[1002,43, 12, 46]
    b = heap_sort a
    b.should== [12, 43, 46, 1002]
  end

  it "should sort [6,5,4,3,2,1]" do
    a=[6,5,4,3,2,1]
    b = heap_sort a
    b.should== [1,2,3,4,5,6]
  end
end

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
新的茶歇课程:使用Linux进行Ruby开发发布时间:2022-07-14
下一篇:
ruby批量插入数据,bulk_insert-----Gem包使用发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap