算法回锅肉——堆排序

示例代码纯粹是为了加深印象,选择的目标语言有更便捷的实现方式,另外去掉了一些假设条件检查。

#encoding:gbk

Size = 20

class Array
	attr_accessor :heap_size	
end

arr = Array.new(Size) do	#初始化待排序数组,随机填写元素
	rand(Size)
end

def left(i)
	2*i
end

def right(i)
	2*i + 1
end

def parent(i)
	i/2
end

def max_heapify(a,i)
	l,r,largest = left(i),right(i),0
	if l <= a.heap_size - 1 and a[l] > a[i]
		largest = l
	else
		largest = i
	end
	if r <= a.heap_size - 1 and a[r] > a[largest]
		largest = r
	end
	if largest != i
		a[i],a[largest] = a[largest],a[i]
		max_heapify(a,largest)
	end
end

def build_max_heap(a)
	a.heap_size = a.size
	(a.size/2 - 1).downto 0 do |i|
		max_heapify(a,i)
	end
end

def heap_sort(a)
	build_max_heap(a)
	(a.size - 1).downto 1 do |i|
		a[0],a[i] = a[i],a[0]
		a.heap_size -= 1
		max_heapify(a,0)
	end
end

puts arr.inspect
arrc = arr.clone
heap_sort(arrc)
puts arrc.inspect

输出如下:

---------- Ruby ----------
[10, 5, 10, 7, 17, 8, 6, 0, 0, 14, 8, 5, 1, 1, 5, 5, 10, 17, 1, 0]
[0, 0, 0, 1, 1, 1, 5, 5, 5, 5, 6, 7, 8, 8, 10, 10, 10, 14, 17, 17]

Output completed (0 sec consumed) - Normal Termination

这个排序算法代码比较紧凑,排序的想法有些取巧,好比用簸箕筛选农作物的种子呢,理解起来是需要花些时间的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值