lua實(shí)現(xiàn)經(jīng)典排序算法


寫在前面

  • 推薦一個(gè)排序可視化網(wǎng)站:VisuAlgo
  • 代碼里所有輸出都是通過下面這個(gè)輸出函數(shù)輸出的
function outNum( needOutNum )
    for k,v in ipairs(needOutNum) do
        print(v)
    end
end
  • lua里的#到這都成注釋了= =||||,所以就不貼代碼了私痹,直接貼圖

一、選擇排序

1. 原理
  • 在未排序序列中找到最型彻巍(大)元素紊遵,存放到排序序列的起始位置
  • 從剩余未排序元素中繼續(xù)尋找最小(大)元素侥蒙,然后放到已排序序列的末尾
2. 代碼實(shí)現(xiàn)
選擇排序

二暗膜、冒泡排序

1. 原理
  • 比較相鄰的元素。如果第一個(gè)比第二個(gè)大鞭衩,就交換他們兩個(gè)
  • 對每一對相鄰元素作同樣的工作学搜,從開始第一對到結(jié)尾的最后一對。這步做完后论衍,最后的元素會(huì)是最大的數(shù)瑞佩。
  • 針對所有的元素重復(fù)以上的步驟,除了最后一個(gè)
  • 持續(xù)每次對越來越少的元素重復(fù)上面的步驟坯台,直到?jīng)]有任何一對數(shù)字需要比較
2. 代碼實(shí)現(xiàn)
冒泡排序
3. 優(yōu)化代碼
  • 記錄最后一次交換的位置炬丸,下一次交換就從這結(jié)束
  • 記錄是否交換,如果沒有交換證明已經(jīng)有序了


    冒泡排序優(yōu)化

三蜒蕾、插入排序

1. 原理
  • 從第一個(gè)元素開始稠炬,該元素可以認(rèn)為已經(jīng)被排序
  • 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描
  • 如果該元素(已排序)大于新元素滥搭,將該元素移到下一位置
  • 重復(fù)步驟3酸纲,直到找到已排序的元素小于或者等于新元素的位置
  • 將新元素插入到該位置后
  • 重復(fù)步驟2~5
2. 代碼實(shí)現(xiàn)
插入排序

四、希爾排序

1. 原理
  • 將整個(gè)待排元素序列分割成若干個(gè)子序列瑟匆,分別進(jìn)行插入排序
  • 依次縮減增量再進(jìn)行排序
  • 待整個(gè)序列中的元素基本有序(增量足夠忻銎隆)時(shí),再對全體元素進(jìn)行一次直接插入排序
2. 代碼實(shí)現(xiàn)
希爾排序

五愁溜、歸并排序

1. 原理
  • 遞歸將數(shù)組兩兩劃分
  • 對劃分的數(shù)組分別進(jìn)行排序
  • 合并排序好的數(shù)組
2. 代碼實(shí)現(xiàn)
  • 遞歸版
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大于數(shù)組長度疾嗅,說明沒有right部分,不需要合并了
        if (left<=#needSortTable and middle<=#needSortTable) then 
            mergeTable(left,middle,#needSortTable)
        end
        i = i + i
    end
    outNum(needSortTable)
end

六冕象、快速排序

1. 原理
  • 挑選基準(zhǔn)值:從數(shù)列中挑出一個(gè)元素
  • 分割:重新排序數(shù)列代承,所有比基準(zhǔn)值小的元素?cái)[放在基準(zhǔn)前面,所有比基準(zhǔn)值大的元素?cái)[在基準(zhǔn)后面(與基準(zhǔn)值相等的數(shù)可以到任何一邊)渐扮。在這個(gè)分割結(jié)束之后论悴,對基準(zhǔn)值的排序就已經(jīng)完成
  • 遞歸排序子序列:遞歸地將小于基準(zhǔn)值元素的子序列和大于基準(zhǔn)值元素的子序列排序
2. 代碼實(shí)現(xiàn)
快速排序

七掖棉、桶排序

1. 原理
  • 設(shè)置一個(gè)定量的數(shù)組當(dāng)作空桶子
  • 尋訪序列,并且把項(xiàng)目一個(gè)一個(gè)放到對應(yīng)的桶子去
  • 對每個(gè)不是空的桶子進(jìn)行排序
  • 從不是空的桶子里把項(xiàng)目再放回原來的序列中
2. 代碼實(shí)現(xiàn)
桶排序

八膀估、堆排序

1. 原理
  • 最大堆調(diào)整(Max Heapify):將堆的末端子節(jié)點(diǎn)作調(diào)整幔亥,使得子節(jié)點(diǎn)永遠(yuǎn)小于父節(jié)點(diǎn)
  • 創(chuàng)建最大堆(Build Max Heap):將堆中的所有數(shù)據(jù)重新排序
  • 堆排序(HeapSort):移除位在第一個(gè)數(shù)據(jù)的根節(jié)點(diǎn),并做最大堆調(diào)整的遞歸運(yùn)算
2. 代碼實(shí)現(xiàn)
堆排序

九察纯、基數(shù)排序

1. 原理
  • 求數(shù)據(jù)的最大位數(shù)
  • 從個(gè)位數(shù)開始對每位數(shù)進(jìn)行排序帕棉,存放在桶中
  • 從不是空的桶子里把值再放回原來的序列中
2. 代碼實(shí)現(xiàn)
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饼记,隨后出現(xiàn)的幾起案子香伴,更是在濱河造成了極大的恐慌,老刑警劉巖具则,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即纲,死亡現(xiàn)場離奇詭異,居然都是意外死亡乡洼,警方通過查閱死者的電腦和手機(jī)崇裁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來束昵,“玉大人拔稳,你說我怎么就攤上這事∏鲁” “怎么了巴比?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長礁遵。 經(jīng)常有香客問我轻绞,道長,這世上最難降的妖魔是什么佣耐? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任政勃,我火速辦了婚禮,結(jié)果婚禮上兼砖,老公的妹妹穿的比我還像新娘奸远。我一直安慰自己,他們只是感情好讽挟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布懒叛。 她就那樣靜靜地躺著,像睡著了一般耽梅。 火紅的嫁衣襯著肌膚如雪薛窥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天眼姐,我揣著相機(jī)與錄音诅迷,去河邊找鬼佩番。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竟贯,可吹牛的內(nèi)容都是我干的答捕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屑那,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了艘款?” 一聲冷哼從身側(cè)響起持际,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哗咆,沒想到半個(gè)月后蜘欲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晌柬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年姥份,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片年碘。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澈歉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屿衅,到底是詐尸還是另有隱情埃难,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布涤久,位于F島的核電站涡尘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏响迂。R本人自食惡果不足惜考抄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔗彤。 院中可真熱鬧川梅,春花似錦、人聲如沸幕与。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啦鸣。三九已至潮饱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诫给,已是汗流浹背香拉。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工啦扬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凫碌。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓扑毡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盛险。 傳聞我的和親對象是個(gè)殘疾皇子瞄摊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355