diff options
Diffstat (limited to 'test/sort.lua')
-rw-r--r-- | test/sort.lua | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/test/sort.lua b/test/sort.lua index 14d4cf22..d665e96b 100644 --- a/test/sort.lua +++ b/test/sort.lua @@ -1,28 +1,25 @@ $debug -function quicksort(r,s) - if s<=r then return end -- caso basico da recursao - local v, i, j = x[r], r, s+1 - i=i+1; while x[i]<v do i=i+1 end - j=j-1; while x[j]>v do j=j-1 end - x[i],x[j]=x[j],x[i] - while j>i do -- separacao - i=i+1; while x[i]<v do i=i+1 end - j=j-1; while x[j]>v do j=j-1 end - x[i],x[j]=x[j],x[i] - end - x[i],x[j]=x[j],x[i] -- undo last swap - x[j],x[r]=x[r],x[j] - quicksort(r,j-1) -- recursao - quicksort(j+1,s) +function quicksort(a,r,s) + if s<=r then return end + local v, i, j = a[r], r, s+1 + repeat + i=i+1; while a[i]<v do i=i+1 end + j=j-1; while a[j]>v do j=j-1 end + a[i],a[j]=a[j],a[i] + until j<=i + a[i],a[j]=a[j],a[i] -- undo last swap + a[j],a[r]=a[r],a[j] + quicksort(a,r,j-1) + quicksort(a,j+1,s) end -function sort(a,n) -- selection sort +function selectionsort(a,n) local i=1 while i<=n do local m, j = i, i+1 while j<=n do - if a[j]<a[m] then m=j end + if a[j]>a[m] then m=j end -- reverse sort j=j+1 end a[i],a[m]=a[m],a[i] -- swap a[i] and a[m] @@ -30,25 +27,26 @@ function sort(a,n) -- selection sort end end -function main() - x={} - n=-1 - n=n+1; x[n]="a" - n=n+1; x[n]="waldemar" - n=n+1; x[n]="luiz" - n=n+1; x[n]="lula" - n=n+1; x[n]="peter" - n=n+1; x[n]="raquel" - n=n+1; x[n]="camilo" - n=n+1; x[n]="andre" - n=n+1; x[n]="marcelo" - n=n+1; x[n]="sedrez" - n=n+1; x[n]="z" - print(x[0]..","..x[1]..","..x[2]..","..x[3]..","..x[4]..","..x[5]..","..x[6]..","..x[7]..","..x[8]..","..x[9]..","..x[10]) - quicksort(1,n-1) - print(x[0]..","..x[1]..","..x[2]..","..x[3]..","..x[4]..","..x[5]..","..x[6]..","..x[7]..","..x[8]..","..x[9]..","..x[10]) - sort (x, n-1) - print(x[0]..","..x[1]..","..x[2]..","..x[3]..","..x[4]..","..x[5]..","..x[6]..","..x[7]..","..x[8]..","..x[9]..","..x[10]) +function show(m,x) + write(m.."\n\t") + local i=0 + while x[i] do + write(x[i]) + i=i+1 + if x[i] then write(",") end + end + write("\n") end -main() +x={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"} + +n=1 while x[n] do n=n+1 end -- count elements +x[0]="A" x[n]="Z" -- quicksort need sentinels + +show("original",x) + +quicksort(x,1,n-1) +show("after quicksort",x) + +selectionsort(x, n-1) +show("after reverse selection sort",x) |