Pessoal, o codigo abaixo cria, popula e ordena um array de numeros. Ele está funcionando, mas para ordenar (procedure reorder) eu só consegui fazer-lo utilizando dois loops.
alguém sabe algum algoritimo de ordenação que utilize apenas um loop para ordenar os numeros?
declare
--
type r_premrec is record (chave number);
type t_premrec is table of r_premrec index by binary_integer;
v_arraym t_premrec;
--
--function
procedure reorder(p_arraym in out t_premrec) is
--return t_premrec is
v_arraux t_premrec;
v_aux number;
begin
--v_arraux := p_arraym;
--
for i in 1..p_arraym.count loop
for j in i..p_arraym.count loop
if p_arraym(i).chave > p_arraym(j).chave then
v_aux := p_arraym(i).chave;
p_arraym(i).chave := p_arraym(j).chave;
p_arraym(j).chave := v_aux;
end if;
end loop;
end loop;
--
--p_arraym := v_arraux;
--return v_arraux;
end;
--
begin
for i in 1..100 loop
v_arraym(i).chave := round(dbms_random.value*10);
end loop;
--
--v_arraym := reorder(v_arraym);
reorder(v_arraym);
--
for i in 1..v_arraym.count loop
dbms_output.put_line(v_arraym(i).chave);
end loop;
end;
Hmmm.. você quer um algoritmo de ordenação de complexidade de (n), linear...
Com um LOOP apenas* não existe.
Existem outros algoritmos que você pode verificar em: http://pt.wikipedia.org/wiki/Algoritmo_ ... %A7%C3%A3o
O que você está utilizando é o famoso Bubble sort(método bolha). Ele SEMPRE fará a ordenação em n². Existem variações dele que melhora, como o "bolha com flag".
No entanto, existem outros que são bem mais rápidos como o famoso QUICKSORT.
Não sei para o que você precisa mas o melhor mesmo é o "ORDER BY", hehehehe.
O order by não serve porque não estou trabalhando com tabelas e nem consigo criar uma tabela dinamica aqui.
Mas vou estudar os outros algoritimos de sort. Talvez tenha algum melhor que esse.
COM CERTEZA tem algorítmos melhores que o bolha, aqueles outros lá "sofisticados", por exemplo.
Encontrei também exmplos de ordenação utilizando collections. Acredito que você pode se aproveitar: http://www.oracle-developer.net/display.php?id=428