Funcionamento de algoritmo em C

3 respostas
jeanmalvessi

Alguém pode me explicar o que faz/como funciona este algoritmo ?

#include "stdafx.h"
#include "stdio.h"

int selmin(int v[], int i, int n) {
	int j, k=i;
	for(j=i+1; j<n; j++)
		if( v[k]>v[j] )
			k=j;
	return k;
}

void main(int v[], int n) {
	int i, k, x;
	for(i=0; i<n-1; i++) {
		k = selmin(v,i,n);
		x = v[i];
		v[i] = v[k];
		v[k] = x;
	}
}

A única coisa que sei é que é um algoritmo de ordenação por seleção

Obrigado>

3 Respostas

InicianteJavaHenriqu

Onde você achou :?:

jamirdeajr

Creio que você possa encontrar nesta apostila do professor Silvio do Lago Pereira:
http://www.ime.usp.br/~slago/slago-ordena-busca.pdf

1.2. ORDENAÇÃO POR SELEÇÃO
A estratégia básica desse método é, em cada fase, selecionar um menor item
ainda não ordenado e permutá-lo com aquele que ocupa a sua posição na
seqüência ordenada. Mais precisamente, isso pode ser descrito assim: para
ordenar uma seqüência ai, ai+1, …, an, selecione uma valor k tal que ak =
min{ ai, ai+1, …, an}, permute os elementos ai e ak e, se i+1<n, repita o procedimento
para ordenar a subseqüência ai+1, …, an.
2 A complexidade determina a eficiência do método; quanto maior for a taxa de crescimento
da função, menos eficiente é o método.
4
Exemplo 1.4. Ordenação da seqüência 46, 55, 59, 14, 38, 27 usando seleção.
Fase i k a1 a2 a3 a4 a5 a6
1o 1 4 46 55 59 14 38 27
2o 2 6 14 55 59 46 38 27
3o 3 5 14 27 59 46 38 55
4o 4 4 14 27 38 46 59 55
5o 5 6 14 27 38 46 59 55
14 27 38 46 55 59
Note que, em cada fase, um valor apropriado para k é escolhido e os itens ai
e ak são permutados. Particularmente na 4o fase, como os valores de i e k são
iguais, a permutação não seria necessária.
O que ainda não está muito claro é como o valor k é escolhido em cada fase.
Para isso, vamos codificar a função selmin(v, i, n), que devolve a posição de
um item mínimo dentro da seqüência vi, vi+1, …, vn. A estratégia adotada
supõe que o item vi é o mínimo e então o compara com vi+1, vi+2, … até que
não haja mais itens ou então que um item menor que vk seja encontrado.
Nesse caso, vk passa a ser o mínimo e o processo continua analogamente.
Exemplo 1.5. Selecionando um item mínimo numa seqüência.
k j v1 v2 v3 v4 v5 v6
1 1 46 55 59 14 38 27
1 2 46 55 59 14 38 27
1 3 46 55 59 14 38 27
4 4 46 55 59 14 38 27
4 5 46 55 59 14 38 27
4 − 46 55 59 14 38 27
Inicialmente, o item v1 é assumido como o mínimo (k=1). Então v1 é comparado
aos demais itens da seqüência até que v4 é encontrado. Como v4 < v1, o
item v4 passa a ser o mínimo (k=4) e o processo continua analogamente.
Exemplo 1.6. Selecionando um item mínimo.

function selmin(var v:vetor; i:integer) : integer; var j, k : integer; begin k:=i; for j:=i+1 to max do if v[k]>v[j] then k:=j; selmin := k; end;
Silvio Lago 5
Exemplo 1.7. Ordenação por seleção: selection sort.

procedure ssort(var v:vetor); var i, k, x : integer; begin for i:=1 to max-1 do begin k := selmin(v,i); x := v[i]; v[i] := v[k]; v[k] := x; end; end;
Análise da ordenação por seleção
Analisando a rotina ssort(), constatamos que ela realiza o mesmo número de
comparações que a rotina bsort(), ou seja, (n−1)+(n−2)+ ?+2+1 = ½(n2−n).
Logo, a sua complexidade de tempo também é O(n2). Entretanto, como a subseqüência
a ordenar diminui de um item a cada troca feita, temos que o número
máximo de trocas3 na ssort() é n−1; um número consideravelmente
menor do que aquele encontrado para a rotina bsort(). Podemos dizer que o
número de trocas na bsort() é O(n2), enquanto na ssort() é O(n).

Espero ter ajudado!

jeanmalvessi

Feito jamirdeajr… era o que eu precisava

Criado 19 de março de 2012
Ultima resposta 20 de mar. de 2012
Respostas 3
Participantes 3