Lua 实现快速排序

原理就不多说了 可以看我上一篇博客
C#实现快排原理

直接上代码

local datas =
{
    
    
    3,1,4,5,32,32,2,9,8,7

    --[[
        这里解释一下为啥不能先从头开始遍历 
        从头开始遍历
        3,1,2,5,32,32,4,9,8,7    targetValue = 3 startIndex = 1 leftIndex = 3  rightIndex = 7;
       leftIndex = 4 
       5,1,2,  4,  3,32,4,9,8,7   左边的第一个并不会比4小   从尾巴开始遍历就可以保证左边一定比基准值要小

        从尾开始遍历
         3,1,2,5,32,32,4,9,8,7    targetValue = 3 startIndex = 1 leftIndex = 3  rightIndex = 7;
         leftIndex = 3  
         2,1,  3,  5,32,32,4,9,8,7
    ]]
}

function PrintTable(datas,title)
    title = title or "";
    print("printTable  length: "..#datas.." |"..title);
    for k,v in ipairs(datas) do
        print(v);
     end  
end    

function QuickSort(datas,startIndex,endIndex)

    if startIndex >= endIndex then
        return;
    end
    
    local minIndex = QuickSortOne(datas,startIndex,endIndex);
    --开始递归 注意 midIndex 不需要排了 开始下标和结束下标记得 -1 +1
    QuickSort(datas,startIndex,minIndex -1);
    QuickSort(datas,minIndex + 1,endIndex);
end

function QuickSortOne(datas,startIndex,endIndex)
    local targetValue = datas[startIndex];  --先默认第一个为中间值

    local leftIndex = startIndex;
    local rightIndex = endIndex;

    while(true) do
       if leftIndex >= rightIndex then
          break;
       end

       while(true) do
        --注意从尾部开始遍历  不能先遍历开头 因为从头开始不能保证最后 左边的值一定小于基准值
        if datas[rightIndex] < targetValue or leftIndex >= rightIndex then
          break;
        end
        
        rightIndex = rightIndex - 1;
        end 
    
       while(true) do
          if datas[leftIndex] > targetValue or leftIndex >= rightIndex then
            break;
          end
          
          leftIndex = leftIndex + 1;
       end 

      
     --交换
     if leftIndex ~= rightIndex then
        swapDatas(datas,leftIndex,rightIndex);
     end

    end

    --结束了 中间的就是mid位置
    local midIndex = leftIndex;
    --把他换到中间去
    swapDatas(datas,leftIndex,startIndex); 
    return midIndex;
end

function swapDatas(datas,i,j)
   local temp = datas[j];
   datas[j] = datas[i];
   datas[i] = temp;
end    

--调用一下
QuickSort(datas,1,#datas);
PrintTable(datas);  

结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32756581/article/details/126730823