1. 程式人生 > >lua中快速排序的理解

lua中快速排序的理解

快速排序的時間複雜度是: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]