快速排序lua实现 递归和栈两种实现

--------------------------------------------------------------
function quicksort_recursive(data,left,right,func)
	local next = compare(data,left,right,func);
	if next ~= nil then 
		quicksort(data,left,next-1,func);
		quicksort(data,next + 1,right,func);
	end
end

function quicksort_stack(data,left,right,func)
	local stack={}
	local index = compare(data,left,right,func);
	table.insert(stack,{index,left,right})
	local count = #(stack)
	while count > 0 do 
		local keyindex = stack[1][1]
		local keyleft = stack[1][2]
		local keyright = stack[1][3]
		local indexleft = compare(data,keyleft,keyindex-1,func);
		if indexleft ~=nil and indexleft < keyindex then
			table.insert(stack,{indexleft,keyleft,keyindex-1})
		end
		local indexright = compare(data,keyindex + 1,keyright,func);
		if indexright ~=nil and indexright > keyindex  then
			table.insert(stack,{indexright,keyindex + 1,keyright})
		end
		table.remove(stack,1)
		count = #(stack)
	end
	stack = nil
end

function compare(data,left,right,func)

	if left >= right then
		return nil
	end
	
	local key = data[left]
	local i = left;
	local j = right;
	
	while i < j do
	
		while j > left and i < j do 
		
			if func(data[j],key) then--<
				data[i] = data[j]
				break;
			end
			j = j - 1
		end

		while i < right and i < j do 
			if func(key,data[i]) then--<
				data[j] = data[i]
				break;
			end	
			i = i + 1
		end
		data[i] = key
	end
	return i
end

function sortfun(a,b) 
	return (a > b) 
end
----------------------------------------------------------------
local data = {0,23,41,52,63,44,25,96,17,8,435,565,99,12,34}
for _,value in pairs(data) do
	print(value)
end

quicksort_stack(data,1,#(data),sortfun)
for _,value in pairs(data) do
	print(value)
end

io.read()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值