Upload
ricardo-pereira-de-fatima
View
70
Download
3
Embed Size (px)
DESCRIPTION
Apostila com diversos metodos de ordenação, feito na linguagem c#.
Citation preview
PILHA class Pilha
{
private class Celula
{
public int valor;
public Celula proxima;
}
private Celula inicio;
public Pilha()
{
inicio = new Celula();
}
PILHA
public void inserir(int num)
{
Celula nova = new Celula();
nova.valor = num;
nova.proxima = inicio.proxima;
inicio.proxima = nova;
}
PILHA
public void mostrar()
{
Celula aux = inicio.proxima;
while (aux != null)
{
Console.Write(aux.valor + " ");
aux = aux.proxima;
}
}
PILHA
public int excluir()
{
int aux = -1;
if (inicio.proxima != null)
{
aux = inicio.proxima.valor;
inicio.proxima = inicio.proxima.proxima;
}
return aux;
}
}
FILA class Fila
{
private class Celula
{
public int valor;
public Celula proxima;
}
private Celula inicio;
public Fila()
{
inicio = new Celula();
}
FILA
public void inserir(int num)
{
Celula nova;
Celula aux = inicio;
while (aux.proxima != null)
aux = aux.proxima;
nova = new Celula();
nova.valor = num;
aux.proxima = nova;
}
FILA
public int excluir()
{
int aux = -1;
if (inicio.proxima != null)
{
aux = inicio.proxima.valor;
inicio.proxima = inicio.proxima.proxima;
}
return aux;
}
}
LISTA
class Lista
{
private class Celula
{
public int valor;
public Celula proxima;
}
private Celula inicio;
public Lista()
{
inicio = new Celula();
}
LISTA
public void inserir(int num, int pos) {
Celula nova;
Celula aux = inicio;
int i = 0;
while (aux.proxima != null && i < pos){
aux = aux.proxima;
i++;
}
nova = new Celula();
nova.valor = num;
nova.proxima = aux.proxima;
aux.proxima = nova;
}
LISTA
public int pesquisarPosicao(int num){
Celula aux = inicio.proxima;
int pos = 0;
while (aux != null && aux.valor != num){
aux = aux.proxima;
pos++;
}
if (aux != null)
return pos;
else
return -1;
}
LISTA
public void excluir(int pos)
{
Celula aux = inicio;
int i = 0;
while (aux != null && i < pos){
aux = aux.proxima;
i++;
}
if (aux != null && aux.proxima != null)
aux.proxima = aux.proxima.proxima;
}
}
RECURSIVIDADE // função recursiva para calcular o fatorial de n
public static int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
RECURSIVIDADE // A função buscaBinaria2 recebe um número x e um vetor
// crescente v[0..n-1]. Ela devolve um índice m
// em 0..n-1 tal que v[m] == x. Se tal m não existe,
// devolve -1.
// A função buscaBinaria1 recebe um número x e um vetor
// crescente v[e..d]. Ela devolve um índice m
// em e..d tal que v[m] == x. Se tal m não
// existe, devolve -1.
public static int buscaBinaria2( int num, int []v) {
return buscaBinaria1( num, 0, v.Length-1, v);
}
RECURSIVIDADE public static int buscaBinaria1( int num, int inicio, int fim,
int []v) {
if (inicio > fim) return -1;
else {
int meio = (inicio + fim)/2;
if (v[meio] == num)
return meio;
if (v[meio] < num)
return buscaBinaria1( num, meio+1, fim, v);
else
return buscaBinaria1( num, inicio, meio-1, v);
}
}
INSERÇÃO
static int[] insertionSort(int[] A) {
int i, j, eleito;
for (i = 1; i < A.Length; i++) {
eleito = A[i];
j = i;
while ((j > 0) && (A[j -1] > eleito)) {
A[j] = A[j -1];
j = j - 1;
}
A[j] = eleito;
}
return A;
}
INSERÇÃO
Melhor caso: 1, 2, 3, 4, ..., n
Comparação: O(n)
Troca: O(n)
Pior caso: n, n-1, n-2, ..., 1
Comparação: O(n2)
Trocas: O(n)
SELEÇÃO public void SelectionSort(int[] vetor) {
int min, aux;
for (int i = 0; i < vetor.Length - 1; i++) {
min = i;
for (int j = i + 1; j < vetor.Length; j++)
if (vetor[j] < vetor[min])
min = j;
if (min != i) {
aux = vetor[min];
vetor[min] = vetor[i];
vetor[i] = aux;
}
}
}
SELEÇÃO
Comparação
Melhor e pior caso compara sempre (O(n2))
Troca
Melhor caso: 1, 2, 3, ..., n -> O(1) pois nenhuma troca é
realizada
Pior caso: n, n-1, n-2, ..., 1 -> O(n2) pois realiza todas as
trocas
BOLHA
public void BubbleSort(int[] intArray) { for (int i = intArray.Length - 1; i > 0; i--){ bool troca = false; for (int j = 0; j <= i - 1; j++){ if (intArray[j] > intArray[j + 1]){ int highValue = intArray[j]; intArray[j] = intArray[j + 1]; intArray[j + 1] = highValue; troca = true; } } if(troca == false) i = 0; }
}
BOLHA
Comparação
Melhor caso em uma passada verifica vetor ordenado
(O(n))
Pior caso compara sempre (O(n2))
Troca
Melhor caso: 1, 2, 3, ..., n -> O(1) pois nenhuma troca é
realizada
Pior caso: n, n-1, n-2, ..., 1 -> O(n2) pois realiza todas as
trocas
SHELL SORT
Similar ao Inserção, mas compara elementos a uma
distância H. Reduz a distância H até 1, quando se
torna o método de Inserção.
SHELL SORT void shellSort(int[] nums) {
int h = 1;
int n = nums.length;
while(h < n)
h = h * 3 + 1;
int c, j;
while (h > 0) {
h = h / 3;
for (int i = h; i < n; i++) {
c = nums[i];
j = i;
while (j >= h && nums[j - h] > c) {
nums[j] = nums[j - h];
j = j – h; }
nums[j] = c; }
}
}
MERGE SORT
Considera dois conjuntos ordenados e cria um
terceiro conjunto ordenado que é a união dos dois
primeiros.
MERGE SORT void MergeSort(int [] numbers)
{
MergeSort_Recursive(numbers, 0, numbers.Length - 1);
}
void MergeSort_Recursive(int [] numbers, int left, int right)
{
int mid;
if (right > left)
{
mid = (right + left) / 2;
MergeSort_Recursive(numbers, left, mid);
MergeSort_Recursive(numbers, (mid + 1), right);
DoMerge(numbers, left, (mid+1), right);
}
}
MERGE SORT void DoMerge(int[] numbers, int left, int mid, int right) { int[] temp = new int[rigth-left+1]; int i, left_end, num_elements, tmp_pos; tmp_pos = 0; left_end = (mid - 1); num_elements = (right - left + 1); while ((left <= left_end) && (mid <= right)) { if (numbers[left] <= numbers[mid]) temp[tmp_pos++] = numbers[left++]; else temp[tmp_pos++] = numbers[mid++]; } while (left <= left_end) temp[tmp_pos++] = numbers[left++]; while (mid <= right) temp[tmp_pos++] = numbers[mid++]; for (i = num_elements - 1; i >= 0; i--) { numbers[right] = temp[i]; right--; } }
HEAP SORT
Organiza os elementos do vetor em uma estrutura
em árvore, de forma que o pai seja sempre maior
que os filhos. Retira o maior elemento (raiz) e refaz
a operação para o conjunto restante.
HEAP SORT
public void heapSort(int[] v) {
buildMaxHeap(v);
int n = v.Length;
for (int i = v.Length - 1; i > 0; i--) {
swap(v, i, 0); //apenas troca os elementos
maxHeapify(v, 0, --n);
}
}
private static void buildMaxHeap(int[] v) {
for (int i = v.Length / 2 - 1; i >= 0; i--)
maxHeapify(v, i, v.Length);
}
HEAP SORT
private static void maxHeapify(int[] v, int pos, int n) {
int max = 2 * pos + 1, right = max + 1;
if (max < n) {
if (right < n && v[max] < v[right])
max = right;
if (v[max] > v[pos]) {
swap(v, max, pos); //apenas troca os elementos
maxHeapify(v, max, n);
}
}
}
QUICK SORT
Seleciona um pivô (primeiro ou último número)
Coloca todos os menores à esquerda e todos os
maiores à direita
Realiza o mesmo processo para cada metade
QUICK SORT
void Ordenar(int[] vetor, int inicio, int fim) {
if (inicio < fim) {
int posicaoPivo = Separar(vetor, inicio, fim);
Ordenar(vetor, inicio, posicaoPivo - 1);
Ordenar(vetor, posicaoPivo + 1, fim);
}
}