Seleciona a primeira posição do vetor e compara o elemento com os demais, partindo da esquerda para a direita, trocando-os quando necessário. Ao término das comparações, seleciona a proxima posição e compara o elemento com os posteriores. Essa lógica é repetida até que a ultima posição esteja ordenada.
Categoria | Complexidade | Performance |
---|---|---|
Seleção | Simples | Baixa |
int* selection_sort(int vetor[], int tamanho) {
int i, j, min, aux;
for (i = 0; i < (tamanho-1); i++) {
min = i;
for (j = (i+1); j < tamanho; j++) {
if(vetor[j] < vetor[min])
min = j;
}
if (i != min) {
aux = vetor[i];
vetor[i] = vetor[min];
vetor[min] = aux;
}
}
return vetor;
}
Compara o elemento da primeira posição do vetor com o elemento da posição seguinte, trocando-os se necessário, e avançando uma posição, até o fim. Essa lógica é repetida até que não haja troca de posições.
Categoria | Complexidade | Performance |
---|---|---|
Troca | Simples | Relativamente Baixa |
int* bubble_sort(int vetor[], int tamanho) {
int i, j, aux = 0;
for(i = tamanho-1; i > 0; i--) {
for(j = 0; j < i; j++) {
if(vetor[j] > vetor[j+1]) {
int temp;
temp = vetor[j];
vetor[j] = vetor[j+1];
vetor[j+1] = temp;
}
}
}
return vetor;
}
Utilizando um elemento como guia (denominado pivô), separamos os elementos em dois vetores, os menores e os maiores que o mesmo. Desses dois vetores criados, a lógica é aplicada repetidamente, até que os itens estejam ordenados.
Categoria | Complexidade | Performance |
---|---|---|
Troca | Relativamente Complexo | Alta |
int* quick_sort(int vetor[], int esq, int dir) {
int i, j, pivo, aux;
i = esq;
j = dir;
pivo = vetor[(i+j)/2];
do {
while(vetor[i] < pivo && i < dir)
i++;
while(vetor[j] > pivo && j > esq)
j--;
if(i <= j) {
aux = vetor[i];
vetor[i] = vetor[j];
vetor[j] = aux;
i++;
j--;
}
} while (i <= j);
if(esq < j)
quick_sort(vetor, esq, j);
if(dir > i)
quick_sort(vetor, i, dir);
return vetor;
}
Baseado no Bubble Sort, também compara os elementos vizinhos da esquerda para a direita. Quando houver troca, o algoritmo compara o elemento com os anteriores, da direita para a esquerda, até encontrar sua posição correta.
Esse método evita que o algoritmo percorra elementos já ordenados.
Categoria | Complexidade | Performance |
---|---|---|
Troca | Relativamente Simples | Relativamente Baixa |
int* gnome_sort(int vetor[], int tamanho) {
int next = 0, previous = 0;
int i = 0;
for(i = 0; i < tamanho; i++) {
if(vetor[i] > vetor[i+1]) {
previous = i;
next = i+1;
while(vetor[previous] > vetor[next]) {
swap(&vetor[previous], &vetor[next]);
if(previous > 0)
previous--;
if(next > 0)
next--;
}
}
}
return vetor;
}
void swap(int *A, int *B) {
int C = *A;
*A = *B;
*B = C;
}
Também baseado no Bubble Sort, a ideia desse algoritmo (também conhecido como Bubble Sort Bidirecional) é eliminar os elementos tartaruga mais rapidamente. O Cocktail Sort compara os elementos em pares, da esquerda para a direita, e, ao chegar no final do vetor, volta comparando os elementos da direita para a esquerda.
Categoria | Complexidade | Performance |
---|---|---|
Troca | Relativamente Complexo | Relativamente Baixa |
int* cocktail_sort(int vetor[], int tamanho) {
int length, bottom, top, swapped, i, aux;
length = tamanho;
bottom = 0;
top = length-1;
swapped = 0;
while(swapped == 0 && bottom < top) {
swapped = 1;
for(i = bottom; i < top; i = i+1) {
if(vetor[i] > vetor[i+1]) {
aux = vetor[i];
vetor[i] = vetor[i+1];
vetor[i+1] = aux;
swapped = 0;
}
}
top = top-1;
for(i = top; i > bottom; i = i-1) {
if(vetor[i] < vetor[i-1]) {
aux = vetor[i];
vetor[i] = vetor[i-1];
vetor[i-1] = aux;
swapped = 0;
}
}
bottom = bottom+1;
}
return vetor;
}
Também visando diminuir os problemas dos elementos tartaruga no Bubble Sort, o Comb Sort utiliza um gap maior para cada iteração, consequentemente melhorando a performance.
Categoria | Complexidade | Performance |
---|---|---|
Troca | Relativamente Simples | Alta |
int* comb_sort(int vetor[], int tamanho) {
float shrink_factor = 1.247330950103979;
int gap = tamanho, swapped = 1, swap, i;
while ((gap > 1) || swapped) {
if (gap > 1)
gap = gap/shrink_factor;
swapped = 0;
i = 0;
while ((gap+i) < tamanho) {
if (vetor[i]-vetor[i+gap] > 0) {
swap = vetor[i];
vetor[i] = vetor[i+gap];
vetor[i+gap] = swap;
swapped = 1;
}
++i;
}
}
return vetor;
}