June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -1,15 +1,17 @@
|
|||
fun mergeSort(m):
|
||||
return m if m.size <= 1
|
||||
let middle = m.size / 2
|
||||
let left = merge(m[:middle])
|
||||
let right = merge(m[middle:]);
|
||||
if m.len <= 1: return m
|
||||
let middle = floor m.len / 2
|
||||
let left = merge(m[:middle])
|
||||
let right = merge(m[middle-1:]);
|
||||
|
||||
fun merge(left, right):
|
||||
let result = []
|
||||
while |left or right|.!empty:
|
||||
result ++ (left.shift() if |left <= right|.first ...
|
||||
else right.shift())
|
||||
result ++ left ++ right
|
||||
while not (left.isEmpty or right.isEmpty):
|
||||
if left[1] <= right[1]:
|
||||
result ++ left.shift()
|
||||
else:
|
||||
result ++ right.shift()
|
||||
result ++ left ++ right
|
||||
|
||||
let arr = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]
|
||||
print mergeSort arr
|
||||
|
|
|
|||
|
|
@ -1,42 +1,27 @@
|
|||
function mergesort!(A::AbstractVector)
|
||||
if length(A) <= 1
|
||||
return A
|
||||
end
|
||||
middle = div(length(A), 2)
|
||||
left = mergesort(A[1:middle])
|
||||
right = mergesort(A[middle + 1:end])
|
||||
result = Array(eltype(left), length(left) + length(right))
|
||||
idx = 1
|
||||
@inbounds while !isempty(left) && !isempty(right)
|
||||
if left[1] <= right[1]
|
||||
result[idx] = left[1]
|
||||
left = left[2:end]
|
||||
function mergesort(arr::Vector)
|
||||
if length(arr) ≤ 1 return arr end
|
||||
mid = length(arr) ÷ 2
|
||||
lpart = mergesort(arr[1:mid])
|
||||
rpart = mergesort(arr[mid+1:end])
|
||||
rst = similar(arr)
|
||||
i = ri = li = 1
|
||||
@inbounds while li ≤ length(lpart) && ri ≤ length(rpart)
|
||||
if lpart[li] ≤ rpart[ri]
|
||||
rst[i] = lpart[li]
|
||||
li += 1
|
||||
else
|
||||
result[idx] = right[1]
|
||||
right = right[2:end]
|
||||
rst[i] = rpart[ri]
|
||||
ri += 1
|
||||
end
|
||||
idx += 1
|
||||
i += 1
|
||||
end
|
||||
@inbounds while !isempty(left)
|
||||
result[idx] = left[1]
|
||||
left = left[2:end]
|
||||
idx += 1
|
||||
if li ≤ length(lpart)
|
||||
copy!(rst, i, lpart, li)
|
||||
else
|
||||
copy!(rst, i, rpart, ri)
|
||||
end
|
||||
@inbounds while !isempty(right)
|
||||
result[idx] = right[1]
|
||||
right = right[2:end]
|
||||
idx += 1
|
||||
end
|
||||
for i=1:length(A)
|
||||
A[i] = result[i]
|
||||
end
|
||||
return A
|
||||
return rst
|
||||
end
|
||||
|
||||
function mergesort(A::AbstractVector)
|
||||
return mergesort!(copy(A))
|
||||
end
|
||||
|
||||
A = randcycle(10)
|
||||
println("unsorted: ", A)
|
||||
println("sorted: ", mergesort(A))
|
||||
v = rand(-10:10, 10)
|
||||
println("# unordered: $v\n -> ordered: ", mergesort(v))
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
merge := proc(arr, left, mid, right)
|
||||
local i, j, k, n1, n2, L, R;
|
||||
n1 := mid-left+1:
|
||||
n2 := right-mid:
|
||||
L := Array(1..n1):
|
||||
R := Array(1..n2):
|
||||
for i from 0 to n1-1 do
|
||||
L(i+1) :=arr(left+i):
|
||||
end do:
|
||||
for j from 0 to n2-1 do
|
||||
R(j+1) := arr(mid+j+1):
|
||||
end do:
|
||||
i := 1:
|
||||
j := 1:
|
||||
k := left:
|
||||
while(i <= n1 and j <= n2) do
|
||||
if (L[i] <= R[j]) then
|
||||
arr[k] := L[i]:
|
||||
i++:
|
||||
else
|
||||
arr[k] := R[j]:
|
||||
j++:
|
||||
end if:
|
||||
k++:
|
||||
end do:
|
||||
while(i <= n1) do
|
||||
arr[k] := L[i]:
|
||||
i++:
|
||||
k++:
|
||||
end do:
|
||||
while(j <= n2) do
|
||||
arr[k] := R[j]:
|
||||
j++:
|
||||
k++:
|
||||
end do:
|
||||
end proc:
|
||||
arr := Array([17,3,72,0,36,2,3,8,40,0]);
|
||||
mergeSort(arr,1,numelems(arr)):
|
||||
arr;
|
||||
|
|
@ -4,35 +4,34 @@
|
|||
@.3 = 'pride' ; @.7 = "gluttony"
|
||||
@.4 = 'avarice' ; @.8 = "sloth"
|
||||
@.5 = 'wrath' ; @.9 = "lust"
|
||||
do #=1 while @.#\==''; end; #=#-1; w=length(#) /*#≡number of entries in @*/
|
||||
do #=1 until @.#==''; end; #=#-1 /*# ≡ the number of entries in @ array.*/
|
||||
call show@ 'before sort' /*show the "before" array elements. */
|
||||
say copies('▒', 70) /*display a separator line to the term.*/
|
||||
say copies('▒', 75) /*display a separator line to the term.*/
|
||||
call mergeSort # /*invoke the merge sort for the array*/
|
||||
call show@ ' after sort' /*show the "after" array elements. */
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
mergeSort: procedure expose @.; call mergeTo@ 1,arg(1); return
|
||||
show@: do j=1 for #; say right('element',20) right(j,length(#)) arg(1)":" @.j; end; return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
mergeTo@: procedure expose @. !.; parse arg L,n; if n==1 then return; h=L+1
|
||||
if n==2 then do; if @.L>@.h then do; _=@.h; @.h=@.L; @.L=_; end; return; end
|
||||
m=n%2 /* [↑] handle case of two items.*/
|
||||
m=n % 2 /* [↑] handle case of two items.*/
|
||||
call mergeTo@ L+m,n-m /*divide items to the left ···*/
|
||||
call mergeTo! L,m,1 /* " " " " right ···*/
|
||||
i=1; j=L+m; do k=L while k<j /*whilst items on right exist ···*/
|
||||
if j==L+n | !.i<=@.j then do; @.k=!.i; i=i+1; end
|
||||
else do; @.k=@.j; j=j+1; end
|
||||
end /*k*/
|
||||
i=1; j=L+m; do k=L while k<j /*whilst items on right exist ···*/
|
||||
if j==L+n | !.i<=@.j then do; @.k=!.i; i=i+1; end
|
||||
else do; @.k=@.j; j=j+1; end
|
||||
end /*k*/
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
mergeTo!: procedure expose @. !.; parse arg L,n,T; if n==1 then do; !.T=@.L; return; end
|
||||
if n==2 then do; h=L+1; q=T+1; !.q=@.L; !.T=@.h; return; end
|
||||
m=n%2 /* [↑] handle case of two items.*/
|
||||
m=n % 2 /* [↑] handle case of two items.*/
|
||||
call mergeTo@ L,m /*divide items to the left ···*/
|
||||
call mergeTo! L+m,n-m,m+T /* " " " " right ···*/
|
||||
i=L; j=m+T; do k=T while k<j /*whilst items on left exist ···*/
|
||||
if j==T+n | @.i<=!.j then do; !.k=@.i; i=i+1; end
|
||||
else do; !.k=!.j; j=j+1; end
|
||||
end /*k*/
|
||||
i=L; j=m+T; do k=T while k<j /*whilst items on left exist ···*/
|
||||
if j==T+n | @.i<=!.j then do; !.k=@.i; i=i+1; end
|
||||
else do; !.k=!.j; j=j+1; end
|
||||
end /*k*/
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
show@: do j=1 for #; say right('element',17) right(j,w) arg(1)":" @.j; end; return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue