Быстрая сортировка, созданная Lua, работает неправильно - PullRequest
0 голосов
/ 23 ноября 2018

Я человек, который недавно изучал Lua.Я пишу QuickSort в Lua.Я перевел код быстрой сортировки, написанный на языке Go, на Lua, и этот код приведен ниже.Функция Table.slice определяет функцию, используемую при выполнении рекурсивных вызовов в QuickSort.

function table.slice(tbl, first, last, step)
    local sliced = {}

    for i = first , last , step  do
        sliced[#sliced+1] = tbl[i]
    end

    return sliced
end

function quickSort(array)
    if #array < 2 then 
        return array
    end

    local left = 1
    local right =  #array
    local pivot = math.random( 1, #array )

    array[pivot], array[right] = array[right], array[pivot]

    for i = 1, #array do
        if array[i] > array[right] then
            array[left], array[i] = array[i], array[left]

            left = left + 1
        end
    end

    array[left], array[right] = array[right], array[left]

    a = table.slice(array,1,left-1,1)
    b = table.slice(array,left+1,#array,1)
    quickSort(a)
    quickSort(b)

    return array
end

Сначала я думал, что допустил ошибку в индексе таблицы Lua, начиная с 1, но я не мог сказать, где я был не прав.Не могли бы вы сказать мне, где я был не прав?Спасибо.

1 Ответ

0 голосов
/ 23 ноября 2018

Я изменил код, изменив данную таблицу напрямую, передав значение диапазона в качестве параметра вместе с комментарием и опубликовав код для быстрой сортировки.

function quickSort(array, le, ri)
    if ri-le < 1 then 
        return array
    end

    local left = le
    local right =  ri
    local pivot = math.random( le, ri )

    array[pivot], array[right] = array[right], array[pivot]

    for i = le, ri do
        if array[i] > array[right] then
            array[left], array[i] = array[i], array[left]

            left = left + 1
        end
    end

    array[left], array[right] = array[right], array[left]

    quickSort(array, 1, left-1)
    quickSort(array, left +1, ri)

    return array
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...