lua中快速排序的理解
阿新 • • 發佈:2019-01-07
快速排序的時間複雜度是: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]