算法与数据结构

lua实现经典排序算法

2019-07-30  本文已影响0人  凉拌姨妈好吃

写在前面

function outNum( needOutNum )
    for k,v in ipairs(needOutNum) do
        print(v)
    end
end

一、选择排序

1. 原理
2. 代码实现
选择排序

二、冒泡排序

1. 原理
2. 代码实现
冒泡排序
3. 优化代码

三、插入排序

1. 原理
2. 代码实现
插入排序

四、希尔排序

1. 原理
2. 代码实现
希尔排序

五、归并排序

1. 原理
2. 代码实现
function mergeSortTest(needSortTable)
    local tempTable = {}
    local mergeTable = function (left,right)
        tempTable = {}
        local middle = math.floor((right + left)/2)
        local i = left
        local j = middle + 1
        local t = 1
        while (i<=middle and j<=right) do
            if needSortTable[i] <= needSortTable[j] then
                tempTable[t] = needSortTable[i]
                i = i + 1
                t = t + 1
            else
                tempTable[t] = needSortTable[j]
                j = j + 1 
                t = t + 1
            end
        end
        while(i<=middle) do
            tempTable[t] = needSortTable[i]
            i = i + 1
            t = t + 1
        end
        while(j<=right) do
            tempTable[t] = needSortTable[j]
            j = j + 1
            t = t + 1
        end
        for i=1,t-1 do
            needSortTable[left] = tempTable[i]
            left = left + 1
        end
    end
    local function divideTable (left,right)
        if left < right then
            local middle = math.floor((right + left)/2)
            divideTable(left,middle)
            divideTable(middle+1,right)
            mergeTable(left,right)
        end
    end
    divideTable(1,#needSortTable)
    outNum(needSortTable)
end
function mergeSortNonRecursiveTest(needSortTable)
    local tempTable = {}
    local mergeTable = function (left,middle,right)
        tempTable = {}
        local i = left
        local j = middle + 1
        local t = 1
        while (i<=middle and j<=right) do
            if needSortTable[i] <= needSortTable[j] then
                tempTable[t] = needSortTable[i]
                i = i + 1
                t = t + 1
            else
                tempTable[t] = needSortTable[j]
                j = j + 1 
                t = t + 1
            end
        end
        while(i<=middle) do
            tempTable[t] = needSortTable[i]
            i = i + 1
            t = t + 1
        end
        while(j<=right) do
            tempTable[t] = needSortTable[j]
            j = j + 1
            t = t + 1
        end
        for i=1,t-1 do
            needSortTable[left] = tempTable[i]
            left = left + 1
        end
    end

    local  i = 1
    while(i<#needSortTable) do
        local left = 1
        local middle = left + i - 1
        local right = middle + i 

        while(right<=#needSortTable) do
            mergeTable(left,middle,right)
            left = right + 1
            middle = left + i - 1
            right = middle + i
        end
        --如果middle大于数组长度,说明没有right部分,不需要合并了
        if (left<=#needSortTable and middle<=#needSortTable) then 
            mergeTable(left,middle,#needSortTable)
        end
        i = i + i
    end
    outNum(needSortTable)
end

六、快速排序

1. 原理
2. 代码实现
快速排序

七、桶排序

1. 原理
2. 代码实现
桶排序

八、堆排序

1. 原理
2. 代码实现
堆排序

九、基数排序

1. 原理
2. 代码实现
function radixSortTest( needSortTable )
    local function getMaxNumOfDigits(unsortedTable)
        local temp = 0
        local num = 0
        for k,v in ipairs(unsortedTable) do
            temp = math.max(temp,v)
        end
        while temp >10 do
            num = num + 1
            temp = temp/(math.pow(10,num))
        end
        return num
    end

    local maxNum = getMaxNumOfDigits(needSortTable)
    for i=0,maxNum do
        local tempList = {0,0,0,0,0,0,0,0,0,0}
        local outPutList = {}
        local curNum = math.pow(10,i)
        for k,v in ipairs(needSortTable) do
            if (v/curNum)%10+1 <= 10 then
                tempList[math.floor(v/curNum)%10+1] = tempList[math.floor(v/curNum)%10+1] + 1
            end
        end
        local k = 1
        while k + 1 < #tempList do
            tempList[k+1] = tempList[k+1] + tempList[k]
            k = k + 1
        end
        for j = #needSortTable,1,-1 do
            local num = math.floor(needSortTable[j]/curNum)%10 + 1
            if tempList[num] > 0 then
                outPutList[tempList[num]] = needSortTable[j]
                tempList[num] = tempList[num] - 1
            end
        end
        
        for q = 1,#needSortTable do
            needSortTable[q] = outPutList[q]
        end
    end
    outNum(needSortTable)
end
上一篇 下一篇

猜你喜欢

热点阅读