分享一个很喜欢的算法的lua实现

6 hjs 7小时前 62次点击

大家好,我是hgs。时隔多日,笔记还没憋出来,闲来无事,又想起以前学算法的日子,那还是很开心的。虽然数据结构和算法到现在我并未完全掌握,但有一些思想已经刻进了脑子里。

今天分享一个完全自己移植的二分查找算法,这也是我最喜欢的一个算法之一,因为是它带我敲响了算法的大门。

不瞒各位讲,第1次接触这个算法的时候,我看了好长时间,最后还是没看懂,哈哈。

虽然这个算法很简单,但它可以直观的体现出算法的强大性。

此算法的主要目的是在一个已排序的升序列表中找到元素K的下标并返回。具体流程是先找到此列表的中间位置将中间位的值与目标值进行比较,如果大于目标值,移动右指针到左边。如果中间值小于目标值,向右移动左指针。然后对左右指针形成的新列表区段,重复上面的步骤。直到找到目标元素或未找到目标元素。

此算法的复杂度为O(logN)。

下面贴上完整代码,原版代码是有语法错误的,这是让ai修正之后的。

function search(list, element)

if list == nil or #list == 0 then

return nil

end

local left, right = 1, #list

while left <= right do

local mid = math.floor((left + right) / 2)

if list[mid] == element then

return mid

elseif list[mid] < element then

left = mid + 1

else

right = mid - 1

end

end

return nil

end

能理解这个算法的,可以在评论区讨论啊,哈哈。

共 2 条评论
hjs [楼主] 7小时前

循环的条件是left 小于等于 right。

我们社区的大佬又出来发力了