Bubble Sort
No bubble sort é analisado de duas em duas posições de um vetor, ordenando conforme seja determinada a lógica, crescente ou decrescente;
A ideia é percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topo o maior elemento da sequência.
Vantagem
A principal vantagem desse algoritmo é que sua implementação é fácil e conhecida.
Estável
Desvantagem
É um método simples, porém lento.
Não apresenta bons resultados quando a lista contém muitos itens.
O fato de o arquivo já estar ordenado não ajuda a reduzir o número de comparações (o custo continua quadrático), porém o número de movimentações cai para zero.
void bubble (int vetor[],int tamanho){
int aux;
for (int i=0; i<=tamanho; i++){
for (int j=0;j<=tamanho;j++){
if (vetor[i]<vetor[j]){
aux=vetor[i];
vetor[i] = vetor [j];
vetor[j] = aux;
}}}
Heap Sort
É uma árvore binária com seguintes propriedades: ○ O valor de cada pai é maior ou menor que os valores armazenados em cada filho; ○ As “folhas” no último nível estão todas nas posições mais à esquerda, podendo haver a falta de um elemento.
Vantagens
● O Algoritmo heapsort apresenta o tempo médio constante e satisfatório (até nos piores cenários);
● Consumo de memória baixo (mesmo em comparação com outros algoritmos de ordenação);
Desvantagens
● Não recomendado para entrada com poucos elementos, por conta do heap ser muito complexo;
● Não é tão rápido quanto o quicksort ou outros métodos em algumas situações;
● O Heapsort não é estável.
void max_heapify(int *a, int i, int n)
{
int j, temp;
temp = a[i];
j = 2*i;
while (j <= n)
{
if (j < n && a[j+1] > a[j])
j = j+1;
if (temp > a[j])
break;
else if (temp <= a[j])
{
a[j/2] = a[j];
j = 2*j;
}
}
a[j/2] = temp;
return;
}
void heapsort(int *a, int n)
{
int i, temp;
for (i = n; i >= 2; i--)
{
temp = a[i];
a[i] = a[1];
a[1] = temp;
max_heapify(a, 1, i - 1);
}
}
void build_maxheap(int *a, int n)
{
int i;
for(i = n/2; i >= 1; i--)
{
max_heapify(a, i, n);
}
}
int main()
{
int n, i, x;
cout<<"Enter no of elements of arrayn";
cin>>n;
int a[20];
for (i = 1; i <= n; i++)
{
cout<<"Enter element"<<(i)<<endl;
cin>>a[i];
}
build_maxheap(a,n);
heapsort(a, n);
cout<<"nnSorted Arrayn";
for (i = 1; i <= n; i++)
{
cout<<a[i]<<endl;
}
return 0;
}
Merge Sort
Vantagens
● Útil para ordenação externa;
● Pior caso: O(n log n);
● Aplicações com restrição de tempo;
● Fácil implementação.
Desvantagens
● Utiliza memória auxiliar;
● Possui dependência de outro vetor de tamanho idêntico;
● Alto consumo de memória.
VAZIO mergeSort(VETOR array)
SE TAMANHO(vetor) > 1 ENTÃO
NUMERICO mid, i
mid ← TAMANHO(vetor) / 2)
VETOR esquerda[mid], direita[TAMANHO(vetor) - mid]
PARA i ← 0 ATÉ TAMANHO(esquerda)
esquerda[i] ← array[i]
FIM
PARA i ← 0 ATÉ TAMANHO(direita)
direita[i] ← array[i]
FIM
//Recursão para distribuição
mergeSort(esquerda)
mergeSort(direita)
intercala(array, esquerda, direita)
ELSE
ESCREVA “Vetor já ordenado.”
FIM
FIM
VAZIO intercala(VETOR array, VETOR esquerda, VETOR direita)
NUMÉRICO i1 ← 0, i2 ← 0, i
PARA i ← 0 ATÉ TAMANHO(array)
// Verifica qual dos 2 valores é menor e isnere no
vetor
SE( i1 < TAMANHO(esquerda) E i2 < TAMANHO(direita)) ENTÃO
SE(esquerda[i1] < direita[i2]) ENTÃO
array[i] ←esquerda[i1]
i1 ← i1 + 1
ELSE
array[i] ← direita[i2]
i2 ← i2 + 1
FIM
FIM
//Caso os tamanhos dos vetores sejam diferentes, faz
a verificação individual de cada vetor
SENÃO SE (i1 < TAMANHO(esquerda)) ENTÃO
array[i] ← esquerda[i1]
i1 ← i1 + 1
SENÃO
array[i] ← direita[i2]
i2 ← i2 + 1
FIM
FIM
FIM
Insertion Sort
Vantagens
Simplicidade
Bom desempenho em listas pequenas
Desvantagens
Não funciona bem com listas grandes
N² passos necessários para funcionar
void InsertSort (int vet[]){
int i,j,aux;
for (i = 1; i < 5; i++){
j = i;
while (j > 0 && vet[j-1] > vet[j]) {
aux = vet[j];
vet[j] = vet[j-1];
vet[j-1] = aux;
j--;
}
}
}
int main(int argc, char** argv) {
int vet[5];
cout<<"Entre com 5 valores: \n";
for (int i = 0; i < 5; i++){
cin>>vet[i];
}
cout<<"\n";
InsertSort(vet);
Bubble Sort
Vantagens
A principal vantagem desse algoritmo é que sua implementação é fácil e conhecida.
Estável
Desvantagens
É um método simples , porém lento .
Não apresenta bons resultados quando a lista contém muitos itens.
O fato de o arquivo já estar ordenado não ajuda a reduzir o número de comparações (o custo continua quadrático), porém o número de movimentações cai para zero.
void cresc(int vetor[]){
int aux;
for(int a=0;a<10;a++){
for(int b=0;b<10;b++){
if(vetor[a]<vetor[b]){
aux=vetor[a];
vetor[a]=vetor[b];
vetor[b]= aux;
}}}
for(int a=0;a<10;a++){
cout<<vetor[a]<<" ";
}
}
int main(int argc, char *argv[]){
int vetor[10];
for(int a=0;a<10;a++){cout<<" digite o "<<a+1<<" num: ";cin>>vetor[a];
} cresc(vetor);
system("PAUSE");
ShellSort
Vantagens:
Shellsort é uma ótima opção para arquivos de tamanho moderado;
Sua implementação é simples e requer uma quantidade de código pequena.
Desvantagens:
O tempo de execução do algoritmo é sensível à ordem inicial do arquivo;
O método não é estável.
void shellSort(int *vet, int size) { //Vou assumir que o tamanho do vetor é 8 ( size = vet[7]) int i , j , value; int gap = 1; while(gap < size) { gap = 3*gap+1; //Aqui é definido o espaçamento entre a verificação
} //das variáveis através do gap
while ( gap > 1) { //Tendo nota que seu valor não pode ser maior que
gap /= 3; //o tamanho do vetor que será ordenado
for(i = gap; i < size; i++) { value = vet[i]; //Vai pegando o valor no vetor com o espaçamento (Se gap for 4, pegar o índex 4, na prox rodada do for, pega o índex 5 etc.)
j = i - gap; //Mesma coisa que em cima, só que vai passando os índex 0,1,2,3 para o J (A variável value pega os valores do índex 4,5,6,7)
while (j >= 0 && value < vet[j]) { // Faz a verificação, basicamente se a variável do índex 4 for menor que a do índex 0, vet [j + gap] = vet[j]; // eles trocam de posição (Aliás, só um valor é trocado por enquanto)
j -= gap; // Aqui ele vai saindo do while depois de fazer as verificações, deixando o J menor que 0
} vet [j + gap] = value; //Aqui o outro valor é trocado, aquele que estava armazenado em value, note que o J só armazenou posição, } // enquanto o value armazenou o valor que estava na posição
}
}
QuickSort
Vantagens
É extremamente eficiente para ordenar arquivos de dados.
Necessita de apenas uma pequena pilha como memoria auxiliar.
Funciona muito bem com listas grandes de itens.
Para dados bem bagunçados o quicksort é mais vantajoso por ser mais econômico.
Desvantagens
Sua implementação é delicada e difícil. Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados.
O método não é estável.
#include<stdio.h>
void Quick(int vetor[10], int inicio, int fim);
int main(){
int vetor[10] = {7, 9, 4, 3, 6, 1, 18, 2, 10, 5};
int i;
printf("Vetor desordenado:\n");
for(i = 0; i < 10; i++){
printf("%d ", vetor[i]);
}
printf("\n");
Quick(vetor, 0, 9);
printf("Vetor ordenado:\n");
for(i = 0; i < 10; i++){
printf("%d ", vetor[i]);
}
printf("\n");
}
void Quick(int vetor[10], int inicio, int fim){
int pivo, aux, i, j, meio;
i = inicio;
j = fim;
meio = (int) ((i + j) / 2);
pivo = vetor[meio];
do{
while (vetor[i] < pivo) i = i + 1;
while (vetor[j] > pivo) j = j - 1;
if(i <= j){
aux = vetor[i];
vetor[i] = vetor[j];
vetor[j] = aux;
i = i + 1;
j = j - 1;
}
}while(j > i);
if(inicio < j) Quick(vetor, inicio, j);
if(i < fim) Quick(vetor, i, fim);
}