Реализации алгоритмов/Сортировка/Слиянием: различия между версиями

Содержимое удалено Содержимое добавлено
мНет описания правки
Строка 630:
merge_sort = (lambda arr: arr if len(arr) == 1 else merge(merge_sort(arr[len(arr)/2:]),
merge_sort(arr[:len(arr)/2]), []))
</source>
 
</source>
 
== [[w:PL/SQL|PL/SQL]] (процедурная реализация) ==
<source lang="plsql">
type sort_lst is table of integer;
---------------------------сортировка слиянием---------------------------------------
Function mergesort (in_list IN sort_lst) return sort_lst
IS
l_left sort_lst := sort_lst();
l_right sort_lst := sort_lst();
l_middle pls_integer;
l_res sort_lst;
begin
if in_list.count <= 1 then
l_res:=in_list;
else
l_middle := in_list.count/2;
for i in in_list.first..in_list.last loop
if i <= l_middle then
l_left.extend;
l_left(l_left.last):=in_list(i);
else
l_right.extend;
l_right(l_right.last):=in_list(i);
end if;
end loop;
 
l_left:=mergesort(l_left);
l_right:=mergesort(l_right);
l_res:=merge2(l_left, l_right);
end if;
return l_res;
end mergesort;
-----------------------------------------------------------------------------------
function merge2(in_left IN sort_lst, in_right IN sort_lst) return sort_lst
IS
l_left sort_lst:=sort_lst();
l_right sort_lst:=sort_lst();
l_res sort_lst:=sort_lst();
begin
l_left:= in_left; l_right:=in_right;
while ((l_left.count > 0) and (l_right.count > 0)) loop
if l_left(l_left.first) <= l_right(l_right.first) then
l_res.extend;
l_res(l_res.last):= l_left(l_left.first);
l_left.delete(l_left.first);
else
l_res.extend;
l_res(l_res.last):= l_right(l_right.first);
l_right.delete(l_right.first);
end if;
end loop;
if (l_left.count > 0) then
for i in l_left.first..l_left.last loop
l_res.extend;
l_res(l_res.last):= l_left(i);
end loop;
end if;
if (l_right.count > 0) then
for i in l_right.first..l_right.last loop
l_res.extend;
l_res(l_res.last):= l_right(i);
end loop;
end if;
return l_res;
end merge2;
----------------------------------------------------------------------------------------------
</source>
***