Home | Administração | Fórum | Livros | WWW | Diário | Tarefas | Alunos |
Esta página foi extraída (com algumas modificações) do capítulo 7, seção 7.1, do livro de Eric Roberts. Convém lembrar que um vetor v[0..n-1] está em ordem crescente se
v[0] < v[1] < . . . < v[n-1] .
(Algumas pessoas preferem dizer "ordem não-decrescente".)
// A função SelectionSort rearranja um vetor // array[0..n-1] em ordem crescente. void SelectionSort( int array[], int n) { int lh, rh, i, temp; for (lh = 0; /*A*/ lh < n; lh++) { rh = lh; for (i = lh + 1; i < n; i++) if (array[i] < array[rh]) rh = i; temp = array[lh]; array[lh] = array[rh]; array[rh] = temp; } }
Para entender o algoritmo, basta observar a seguinte propriedade invariante, válida no início de cada iteração, ou seja, a cada passagem pelo ponto A:
Essas propriedades invariantes podem ser reescritas de maneira mais informal:
if (lh < rh) { temp = array[lh]; array[lh] = array[rh]; array[rh] = temp; }
66 33 22 99 33 22 22 33 33 66 66 99
então sua função deve devolver 0.
// A função abaixo rearranja em ordem crescente // um vetor array[low..high]. void SelectionSortR( int array[], int low, int high) { int rh, i, temp; if (low < high) { rh = low; for (i = low + 1; i <= high; i++) { if (array[i] < array[rh]) rh = i; } temp = array[low]; array[low] = array[rh]; array[rh] = temp; SelectionSortR( array, low+1, high); } }
O consumo de tempo do algoritmo é proporcional ao número de comparações entre elementos do vetor. No pior caso esse número é
(n-1) + (n-2) + ... + 2 + 1,
ou seja, igual a (n2 - n)/2. Para simplificar, dizemos que o consumo de tempo "é da ordem de n2".
Animação de algoritmos de ordenação (universidade de Carlton, Canadá).