#define MaxN 3000
struct par
{ int i1;
int i2; };
int V[MaxN + 1];
main()
{
struct par mima;
scanf("%d", &n);
for (i=1; i<=n; i++)
{
V[i] = 2*MaxN*rand();
}
Contador = 0;
mima = minmax(1, n);
printf("\n\n Minimo e maximo do vetor: V[%d]=%d e V[%d]=%d \n",
mima.i1, V[mima.i1], mima.i2, V[mima.i2]);
printf("\n Numero de comparacoes: %d \n", Contador);
}
struct par minmax( inicio, fim )
int inicio, fim;
{
struct par mm, mm1, mm2;
int meio;
printf(" %d %d \n",inicio, fim);
if (fim - inicio <= 1)
{
Contador++;
if( V[inicio] < V[fim] )
{
mm.i1 = inicio;
mm.i2 = fim;
}
else
{
mm.i1 = fim;
mm.i2 = inicio;
}
}
else
{
meio = ((inicio + fim)/2);
printf(" %d \n",meio);
mm1 = minmax(inicio, meio);
mm2 = minmax(meio+1, fim);
Contador++;
if ( V[mm1.i1] > V[mm2.i1] )
{
mm.i1 = mm2.i1;
}
else
{
mm.i1 = mm1.i1;
}
Contador++;
if ( V[mm1.i2] < V[mm2.i2] )
{
mm.i2 = mm2.i2;
}
else
{
mm.i2 = mm1.i2;
}
}
return( mm );
}
program teste;
const MAX = suficiente;
var A: array [1..MAX] of integer;
n, i: integer;
procedure coloca_i (i: integer)
var j, item: integer;
cont: boolean;
begin
j := 2*i; item := A[i]; cont := true;
while (j <= n) and cont do
begin
if (j < n) and (A[j] < A[j+1])
then j:=j+1;
if (item > A[j])
then cont := false;
else
begin
A[j div 2] := A[j];
j := j*2;
end;
end;
A[j div 2] := item;
end;
begin
read(n); (* n e' uma potencia de 2 menos 1 *)
for i:= 1 to n do
read(A[i]); (* Le um numero inteiro qualquer *)
(* Loop Principal *)
for i:= (n div 2) down to 1 do
coloca_i (i);
end.
This document was translated from LATEX by HEVEA.