Another update from ingydotnet^djgoku

This commit is contained in:
Ingy döt Net 2015-11-18 06:14:39 +00:00
parent 91df62d461
commit 948b86eafa
7604 changed files with 108452 additions and 22726 deletions

View file

@ -1,60 +1,68 @@
class
MERGE_SORT [G -> COMPARABLE]
create
sort
feature
sort(ar: ARRAY[G])
-- sort array ar with mergesort and save it in sorted_array
require
ar_not_empty: ar.is_empty= FALSE
do
sort (ar: ARRAY [G])
-- Sorted array in ascending order.
require
ar_not_empty: not ar.is_empty
do
create sorted_array.make_empty
mergesort(ar, 1, ar.count)
sorted_array:= ar
ensure
sorted_array_not_empty: sorted_array.is_empty = FALSE
sorted: is_sorted(sorted_array, 1, sorted_array.count)= TRUE
end
sorted_array: ARRAY[G]
mergesort (ar, 1, ar.count)
sorted_array := ar
ensure
sorted_array_not_empty: not sorted_array.is_empty
sorted: is_sorted (sorted_array, 1, sorted_array.count)
end
sorted_array: ARRAY [G]
feature {NONE}
mergesort(ar:ARRAY[G]; l,r:INTEGER)
mergesort (ar: ARRAY [G]; l, r: INTEGER)
-- Sorting part of mergesort.
local
m: INTEGER
do
if l<r then
m := (l+r)//2
mergesort(ar,l, m)
mergesort(ar,m+1,r)
merge(ar,l,m,r)
if l < r then
m := (l + r) // 2
mergesort (ar, l, m)
mergesort (ar, m + 1, r)
merge (ar, l, m, r)
end
end
merge(ar:ARRAY[G]; l,m,r: INTEGER)
merge (ar: ARRAY [G]; l, m, r: INTEGER)
-- Merge part of mergesort.
require
positive_index_l: l>=1
positive_index_m: m>=1
positive_index_r: r>=1
ar_not_empty: ar.is_empty= FALSE
positive_index_l: l >= 1
positive_index_m: m >= 1
positive_index_r: r >= 1
ar_not_empty: not ar.is_empty
local
merged: ARRAY[G]
h,i,j,k: INTEGER
merged: ARRAY [G]
h, i, j, k: INTEGER
do
i := l
j := m+1
j := m + 1
k := l
create merged.make_empty
create merged.make_filled (ar [1], 1, ar.count)
from
until
i > m or j > r
loop
if ar.item (i) <= ar.item (j) then
merged.force(ar.item(i),k)
i := i +1
merged.force (ar.item (i), k)
i := i + 1
elseif ar.item (i) > ar.item (j) then
merged.force(ar.item(j),k)
j := j+1
merged.force (ar.item (j), k)
j := j + 1
end
k := k+1
k := k + 1
end
if i > m then
from
@ -62,8 +70,8 @@ feature {NONE}
until
h > r
loop
merged.force(ar.item(h),k+h-j)
h := h+1
merged.force (ar.item (h), k + h - j)
h := h + 1
end
elseif j > m then
from
@ -71,8 +79,8 @@ feature {NONE}
until
h > m
loop
merged.force(ar.item(h),k+h-i)
h := h+1
merged.force (ar.item (h), k + h - i)
h := h + 1
end
end
from
@ -81,37 +89,32 @@ feature {NONE}
h > r
loop
ar.item (h) := merged.item (h)
h := h+1
h := h + 1
end
ensure
is_partially_sorted: is_sorted(ar, l,r)= TRUE
ensure
is_partially_sorted: is_sorted (ar, l, r)
end
is_sorted(ar: ARRAY[G];l, r: INTEGER): BOOLEAN
--- feature is not required for mergesort but is used for contracts
is_sorted (ar: ARRAY [G]; l, r: INTEGER): BOOLEAN
-- Is 'ar' sorted in ascending order?
require
ar_not_empty: ar.is_empty= FALSE
ar_not_empty: not ar.is_empty
l_in_range: l >= 1
r_in_range: r <= ar.count
local
smaller : BOOLEAN
i: INTEGER
do
smaller:= TRUE
Result := True
from
i:= l
i := l
until
i=r
i = r
loop
if ar[i]> ar[i+1] then
smaller:= FALSE
if ar [i] > ar [i + 1] then
Result := False
end
i:= i+1
end
if smaller = TRUE then
RESULT := TRUE
else
RESULT:= FALSE
i := i + 1
end
end
end

View file

@ -1,19 +1,31 @@
class
APPLICATION
inherit
ARGUMENTS
create
make
feature
make
do
test:= <<2,5,66,-2, 0, 7>>
io.put_string ("unsorted"+ "%N")
across test as ar loop io.put_string (ar.item.out + "%T") end
io.put_string ("%N"+"sorted"+ "%N")
create merge.sort (test)
across merge.sorted_array as ar loop io.put_string (ar.item.out + "%T") end
end
test: ARRAY[INTEGER]
merge: MERGE_SORT[INTEGER]
feature
make
do
test := <<2, 5, 66, -2, 0, 7>>
io.put_string ("unsorted" + "%N")
across
test as ar
loop
io.put_string (ar.item.out + "%T")
end
io.put_string ("%N" + "sorted" + "%N")
create merge.sort (test)
across
merge.sorted_array as ar
loop
io.put_string (ar.item.out + "%T")
end
end
test: ARRAY [INTEGER]
merge: MERGE_SORT [INTEGER]
end