lua各种排序算法

--
--获取系统时间,计算代码执行所花费的时间
--以下代码经过vs2013验证
--socket.gettime()获取的正是时间戳,精确度很高,单位是秒。小数点后面还有很多位,可以通过乘以1000这样的换算,得到微秒(ms)。
--
local socket = require "socket"
local sort = class("sort")

--local start_time = socket.gettime()
--local end_time= socket.gettime()
--local use_time = (end_time - start_time )*1000
--print("start_time: "..start_time .."ms \n")
--print("end_time: "..end_time .."ms \n")
--print("used time: "..use_time .."ms \n")


function sort:init()

    self:init_choose( 7 )

    local yyy = 1
end

function sort:init_choose(iType)
    local cardData = {0x04,0x12,0x07,0x22,0x06,0x43,0x33,0x18,0x09,0x34,0x29}

    local start_time = socket.gettime()
    for i=1, 10000 do       
        cardData = {0x04,0x12,0x07,0x22,0x06,0x43,0x33,0x18,0x09,0x34,0x29}
        if iType == 0 then
            self:test(cardData)              -- 1万次11个数字累加耗时 0.326s     /  1万次11个数字空循环耗时 0.1446s    
        elseif iType == 1 then
            self:mao_pao(cardData)           -- 1万次11个数字冒泡排序耗时 1.66s
        elseif iType == 2 then
            self:xuan_zhe(cardData)          -- 1万次11个数字选择排序耗时 1.88s
        elseif iType == 3 then
            self:cha_ru(cardData)            -- 1万次11个数字插入排序耗时 1.20s
        elseif iType == 4 then
            self:xi_er(cardData)             -- 1万次11个数字希尔排序耗时 1.92s
        elseif iType == 5 then
            self:gui_bing(cardData)          -- 1万次11个数字归并排序耗时 6.095s
        elseif iType == 6 then
            self:quick_sort(cardData, 1, #cardData)     ---- 1万次11个数字快速排序耗时 2.409s
        elseif iType == 7 then
            self:dui_sort(cardData)          -- 1万次11个数字堆排序耗时 
        elseif iType == 8 then

        elseif iType == 9 then

        elseif iType == 10 then

        end
    end
    local end_time = socket.gettime()
    local use_time = end_time - start_time

    local xxx = 1
end

--for循环时间开销
function sort:test( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    local temp = 0
    for i=1, cardCount do
--        temp = temp + i
    end

    return cardData
end

--冒泡排序
function sort:mao_pao( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    for i=1, cardCount do
        for j=1, cardCount  - i do
            if cardData[j+1] < cardData[j] then
                local temp = cardData[j+1]
                cardData[j+1] = cardData[j]
                cardData[j] = temp
            end
        end
    end
    return cardData
end

--选择排序
function sort:xuan_zhe( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    for i=1, cardCount do
        local minIndex = i
        for j=i, cardCount do
            if cardData[j] < cardData[minIndex] then    --找到最小的数
                minIndex = j        --将最小数的索引保存
            end
        end
        local temp = cardData[minIndex]
        cardData[minIndex] = cardData[i]
        cardData[i] = temp
    end
    return cardData
end

--插入排序
function sort:cha_ru( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    local current = 1
    for i=1, cardCount-1 do
        current = cardData[i+1]
        local preIndex = i
        while(preIndex >= 1 and current < cardData[preIndex])
        do
            cardData[preIndex+1] = cardData[preIndex]
            preIndex = preIndex - 1
        end
        cardData[preIndex+1] = current
    end
    return cardData
end

--希尔排序
function sort:xi_er( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    local temp = 1
    local gap = math.floor(cardCount/2)
    while (gap > 0)
    do
        for i = gap, cardCount do
            temp = cardData[i]
            local preIndex = i - gap
            while(preIndex >= 1 and cardData[preIndex] > temp)
            do
                cardData[preIndex + gap] = cardData[preIndex]
                preIndex = preIndex - gap
            end
            cardData[preIndex + gap] = temp
        end
        gap = math.floor(gap/2)
    end
    return cardData
end

--归并排序
function sort:gui_bing( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    if cardCount < 2 then return cardData end
    local temp = {}
    self:gui_bing_sort( cardData,1,cardCount, temp )

end
function sort:gui_bing_sort( arr,left,right, temp )
    if left < right then
        local mid = math.floor((left+right)/2)
        self:gui_bing_sort(arr,left,mid,temp)
        self:gui_bing_sort(arr,mid+1,right,temp)
        self:gui_bing_merge(arr, left,mid, right, temp)
    end
end
function sort:gui_bing_merge( arr, left, mid, right, temp )
    local i = left      --左序列指针
    local j = mid + 1   --右序列指针
    local t = 0         --临时数组指针
    while (i<=mid and j<=right)
    do
        if (arr[i]<=arr[j]) then
            temp[t] = arr[i]
            t = t + 1
            i = i + 1
        else
            temp[t] = arr[j]
            t = t + 1
            j = j + 1
        end
    end

    while (i<=mid)  --将左边剩余元素填充进temp中
    do
        temp[t] = arr[i]
        t = t + 1
        i = i + 1
    end

    while (j<=right)    --将右序列剩余元素填充进temp中
    do
        temp[t] = arr[j]
        t = t + 1
        j = j + 1
    end
    t = 0
    --将temp中的元素全部拷贝到原数组中
    while (left <= right)
    do
        arr[left] = temp[t]
        left = left + 1
        t = t + 1
    end

    return arr
end

--快速排序
function sort:quick_sort( cardData, left, right )
    if left < right then
        local i = left
        local j = right
        local x = cardData[i]
        while (i<j)
        do
            while (i<j and cardData[j]>x)
            do
                j = j - 1       --从右向左找第一个小于x的数
            end
            if i<j then
                cardData[i] = cardData[j]
                i = i + 1
            end
            while (i<j and cardData[i] < x)
            do
                i = i + 1       --从左向右找第一个大于x的数
            end
            if i<j then
                cardData[j] = cardData[i]
                j = j - 1
            end
        end
        cardData[i] = x
        self:quick_sort(cardData, left, i-1)
        self:quick_sort(cardData, i+1, right)
    end
end

--堆排序 (有问题)
function sort:dui_sort( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end

    local len = #cardData
    --1.构建要给最大堆
    self:buildMaxHeap(cardData)
    --2.循环将堆首位(最大值)与末位交换,然后再重现调整最大堆
    while ( len > 1 )
    do
        self:dui_sort_swap(cardData, 1, len)
        len = len - 1
        self:dui_sort_adjustHeap(cardData, 1)
    end
    return cardData
end
function sort:buildMaxHeap(array)
    local len = #array
    local temp = math.floor((len-1)/2)
    for i = temp + 1, 1, -1 do
        self:dui_sort_adjustHeap(array, i)
    end
end
function sort:dui_sort_adjustHeap(array, i)
    local maxIndex = i
    local len = #array
    --如果有左子树,且左子树大于父节点,则将最大指针指向左子树
    if (i*2 < len and array[i*2] > array[maxIndex] ) then
        maxIndex = i*2
    end
    --如果有右子树,且右子树大于父节点,则将最大指针指向右子树
    if( i*2+1 < len and array[i*2+1]>array[maxIndex]) then
        maxIndex = i*2 + 1
    end
    --如果父节点不是最大值,则将父节点与最大值交换,并且递归调整与父节点交换的位置
    if (maxIndex ~= i) then
        self:dui_sort_swap(array, maxIndex, i)
        self:dui_sort_adjustHeap(array, maxIndex)
    end
end
function sort:dui_sort_swap(arr, a, b)
    local temp = arr[a]
    arr[a] = arr[b]
    arr[b] = temp
end

--计数排序
function sort:counting( cardData )
    if cardData == nil then return  end
    local cardCount = #cardData
    if cardCount == 0 then return cardData end


end

return sort

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值