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);  

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种高效的排序算法,它的基本思想是通过一次排序将数组分成两个子数组,其中一个子数组的所有元素都比另一个子数组的所有元素小,然后再分别对这两个子数组递归地进行快速排序。 以下是使用Lua语言实现快速排序的示例代码: ``` function quickSort(arr, left, right) left = left or 1 right = right or #arr if left >= right then return end local pivotIndex = partition(arr, left, right) quickSort(arr, left, pivotIndex - 1) quickSort(arr, pivotIndex + 1, right) end function partition(arr, left, right) local pivot = arr[right] local i = left - 1 for j = left, right - 1 do if arr[j] < pivot then i = i + 1 arr[i], arr[j] = arr[j], arr[i] end end arr[i + 1], arr[right] = arr[right], arr[i + 1] return i + 1 end -- 测试 local arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5} quickSort(arr) for i, v in ipairs(arr) do print(v) end ``` 在上面的代码中,quickSort函数接收一个数组arr和两个可选参数left和right作为参数,其中left和right分别表示需要排序的子数组的左右边界,如果没有传递这两个参数,默认将整个数组排序。在快速排序中,我们首先通过partition函数将数组分成两个子数组,然后再对这两个子数组递归地进行快速排序。 在partition函数中,我们选择数组中的最后一个元素作为pivot,然后通过一次循环将数组分成两个子数组,其中一个子数组的所有元素都比pivot小,另一个子数组的所有元素都比pivot大。最后,将pivot交换到子数组的中间位置,返回pivot的索引。 在测试代码中,我们使用了一个随机数组进行测试,并打印出排序后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值