原理就不多说了 可以看我上一篇博客
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);