快速排序lua实现 递归和栈两种实现

来源:互联网 发布:芈月到底爱谁知乎 编辑:程序博客网 时间:2024/05/21 09:51
  1. --------------------------------------------------------------  
  2. function quicksort_recursive(data,left,right,func)  
  3.     local next = compare(data,left,right,func);  
  4.     if next ~= nil then   
  5.         quicksort(data,left,next-1,func);  
  6.         quicksort(data,next + 1,right,func);  
  7.     end  
  8. end  
  9.   
  10. function quicksort_stack(data,left,right,func)  
  11.     local stack={}  
  12.     local index = compare(data,left,right,func);  
  13.     table.insert(stack,{index,left,right})  
  14.     local count = #(stack)  
  15.     while count > 0 do   
  16.         local keyindex = stack[1][1]  
  17.         local keyleft = stack[1][2]  
  18.         local keyright = stack[1][3]  
  19.         local indexleft = compare(data,keyleft,keyindex-1,func);  
  20.         if indexleft ~=nil and indexleft < keyindex then  
  21.             table.insert(stack,{indexleft,keyleft,keyindex-1})  
  22.         end  
  23.         local indexright = compare(data,keyindex + 1,keyright,func);  
  24.         if indexright ~=nil and indexright > keyindex  then  
  25.             table.insert(stack,{indexright,keyindex + 1,keyright})  
  26.         end  
  27.         table.remove(stack,1)  
  28.         count = #(stack)  
  29.     end  
  30.     stack = nil  
  31. end  
  32.   
  33. function compare(data,left,right,func)  
  34.   
  35.     if left >= right then  
  36.         return nil  
  37.     end  
  38.       
  39.     local key = data[left]  
  40.     local i = left;  
  41.     local j = right;  
  42.       
  43.     while i < j do  
  44.       
  45.         while j > left and i < j do   
  46.           
  47.             if func(data[j],key) then--<  
  48.                 data[i] = data[j]  
  49.                 break;  
  50.             end  
  51.             j = j - 1  
  52.         end  
  53.   
  54.         while i < right and i < j do   
  55.             if func(key,data[i]) then--<  
  56.                 data[j] = data[i]  
  57.                 break;  
  58.             end   
  59.             i = i + 1  
  60.         end  
  61.         data[i] = key  
  62.     end  
  63.     return i  
  64. end  
  65.   
  66. function sortfun(a,b)   
  67.     return (a > b)   
  68. end  
  69. ----------------------------------------------------------------  
  70. local data = {0,23,41,52,63,44,25,96,17,8,435,565,99,12,34}  
  71. for _,value in pairs(data) do  
  72.     print(value)  
  73. end  
  74.   
  75. quicksort_stack(data,1,#(data),sortfun)  
  76. for _,value in pairs(data) do  
  77.     print(value)  
  78. end  
  79.   
  80. io.read()  
0 0