您的位置:首页 > 编程语言 > Lua

lua中快速排序的理解

2018-01-21 16:25 555 查看
快速排序的时间复杂度是:O(n * log(n))
快速排序的主要思想是分治思想
快速排序是找出一个元素作为基准,然后对数组进行分区操作,是基准左边的元素的值不大于基准值,基准右边的元素值,都不少于基准值,如此作为基准的元素调整到排序后的正确位置.

--[[--
-   partition: 获得快排中介值位置
-   @param: list, low, high - 参数描述
-   @return: pivotKeyIndex - 中介值索引
]]
function partition(list, low, high)
local low = low
local high = high
local pivotKey = list[low] -- 定义一个中介值

-- 下面将中介值移动到列表的中间
-- 当左索引与右索引相邻时停止循环
while low < high do
-- 假如当前右值大于等于中介值则右索引左移
-- 否则交换中介值和右值位置
while low < high and list[high] >= pivotKey do
high = high - 1
end
swap(list, low, high)
-- 假如当前左值小于等于中介值则左索引右移
-- 否则交换中介值和左值位置
while low < high and list[low] <= pivotKey do
low = low + 1
end
swap(list, low, high)
end
return low
end

--[[--
-   orderByQuick: 快速排序
-   @param: list, low, high - 参数描述
-    @return: list - table
]]
function orderByQuick(list, low, high)
if low < high then
-- 返回列表中中介值所在的位置,该位置左边的值都小于等于中介值,右边的值都大于等于中介值
local pivotKeyIndex = partition(list, low, high)
-- 分别将中介值左右两边的列表递归快排
orderByQuick(list, low, pivotKeyIndex - 1)
orderByQuick(list, pivotKeyIndex + 1, high)
end
end

function swap(list,low,high)
local temp = 0
temp = list[low]
list[low] = list[high]
list[high] = temp
end

local printT = function(t)
print("printT ---------------")
table.walk(t, function(v, k)
print(k, v)
end)
print("---------------")
end

function table.walk( t, fn )
for k, v in pairs( t ) do
fn( v, k )
end
end

local test_list = {1,2,-2,3,-3444,-3344,3334,334,344,345,667,77}

local num = #test_list
orderByQuick(test_list, 1, num) --  总结
print("after order--------")
printT(test_list)

运行结果

after order--------

printT ---------------

1 -3444

2 -3344

3 -2

4 1

5 2

6 3

7 77

8 334

9 344

10 345

11 667

12 3334

---------------

[Finished in 0.1s]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua 快速排序