Ordenao no Lugar
Usa a mesma memria para colocar a sada ordenada
romulo@das.ufsc.br
http://www.das.ufsc.br/~romulo
Maio/2011
Referncias
Quicksort
Ordena no lugar, melhor no caso geral
Merge sort
Mesmo desempenho que quicksort, necessita o dobro da mem ria, facilita trabalhar
com a diviso em partes dos dados originais
Counting sort
Algoritmo com tempo linear, trabalha com inteiros cujo maior valor conhecido
Radix sort
Algorimo com tempo linear, ordena d gito por dgito, bom para elementos de
tamanho fixo que podem ser quebrados em peda os, na forma de inteiros
Ordenao
Insertion sort
Quicksort
23
21
76
16
52
43
Merge sort
Counting sort
Radix sort
10
21
76
16
52
43
23
21
76
16
52
43
11
Determinar onde colocar o novo elemento pode requerer uma compara o dele com
todos os demais elementos j inseridos no conjunto ordenado
23
21
76
16
52
43
23
21
76
16
52
43
21
23
76
16
52
43
12
23
21
76
16
52
43
23
21
76
16
52
43
23
21
76
16
52
43
23
21
76
16
52
43
21
23
76
16
52
43
21
23
76
16
52
43
21
23
76
16
52
43
21
23
76
16
52
43
16
21
23
76
52
43
16
21
23
52
76
43
16
21
23
43
52
76
13
16
issort
int issort(void *data, int size, int esize,
int (*compare)(const void *key1, const void *key2));
23
21
76
16
52
43
23
21
76
16
52
43
21
23
76
16
52
43
21
23
76
16
52
43
16
21
23
76
52
43
Retorno
0 se a ordenao tiver sucesso, ou -1 caso contrrio.
Descrio
Usa insertion sort para ordenar o array de elementos em data. O nmero de
elementos em data especificado por size. O tamanho de cada elemento
especificado por esize. O pointer para fun o compare especifica uma funo
definida por usurio que compara os elementos. Esta fun o dever retornar 1 se
key1>key2, 0 se key1=key2, e -1 se key1<key2 para uma ordenao crescente. Para
uma ordenao decrescente, compare dever inverter os casos que retornam 1 e -1.
Quando issort returna, data contem os elementos ordenados.
14
17
23
21
76
16
52
43
23
21
76
16
52
43
21
23
76
16
52
43
21
23
76
16
52
43
16
21
23
76
52
43
16
21
23
52
76
43
int issort(void *data, int size, int esize, int (*compare)(const void *key1, const void *key2)) {
char *a = data;
void *key;
int i, j;
if ((key = (char *) malloc(esize)) == NULL)
return -1;
for (j = 1; j < size; j++) {
memcpy(key, &a[j * esize], esize);
i = j - 1;
while (i >= 0 && compare(&a[i * esize], key) > 0) {
memcpy(&a[(i + 1) * esize], &a[i * esize], esize);
i--;
}
memcpy(&a[(i + 1) * esize], key, esize);
}
free(key);
return 0;
}
15
18
Ordenao
Insertion sort
Quicksort
Merge sort
Usando 10:
Usando 36:
Counting sort
Necessrio um mtodo para escolha do valor de particionamento
Radix sort
19
22
52
11
94
28
36
14
80
20
23
52
11
94
28
36
14
80
24
52
11
94
28
36
14
80
21
24
24
52
11
94
28
36
14
80
24
52
11
94
28
36
14
80
24
52
11
94
28
36
14
80
24
52
11
94
28
36
14
80
24
14
11
94
28
36
52
80
24
14
11
94
28
36
52
80
24
14
11
94
28
36
52
80
24
14
11
28
94
36
52
80
24
14
11
28
94
36
52
80
25
24
52
11
94
28
36
14
28
80
52
11
94
28
36
14
80
24
14
11
94
28
36
52
80
24
14
11
94
28
36
52
80
26
29
24
52
11
94
28
36
14
80
24
52
11
94
28
36
14
80
24
14
11
94
28
36
52
80
24
14
11
94
28
36
52
80
24
14
11
28
94
36
52
80
24
11
11
27
24
52
11
14
11
28
14
24
14
24
28
28
94
28
36
14
80
94
36
52
80
36
52
94
80
52
80
36
94
30
qksort
int qksort(void *data, int size, int esize, int i, int k,
int (*compare) (const void *key1, const void *key2));
Retorno
0 se a ordenao tiver sucesso, ou -1 caso contr rio.
Descrio
Usa quicksort para ordenar o array de elementos em data. O nmero de elementos
em data especificado por size. O tamanho de cada elemento especificado por
esize. Os argumentos i e k definem a partio corrente sendo ordenada e
inicialmente deveriam ser 0 e size - 1, respectivamente. O pointer para fun o
compare especifica uma funo definida por usu rio para comparar elementos. Ela
deve executar de uma forma similar quela descrita para para issort. Quando qksort
retorna, data contem os elementos ordenados.
if (i >= k) // Stop partitioning when the left and right counters cross.
break;
// Swap the elements now under the left and right counters.
memcpy(temp, &a[i * esize], esize);
memcpy(&a[i * esize], &a[k * esize], esize);
memcpy(&a[k * esize], temp, esize);
}
else {
}
free(pval);
return k;
}
free(temp);
31
34
#include <stdlib.h>
#include <string.h>
int j;
#include "sort.h"
return 1;
else if (*(const int *)int1 < *(const int *)int2)
return -1;
else
return 0;
}
Rmulo Silva de Oliveira, DAS-UFSC, maio/2011
32
35
Ordenao
Insertion sort
char *a = data;
Quicksort
Merge sort
Counting sort
Radix sort
33
36
11
72
82
10
25
36
44
10
A partir de agora:
Junta os sub-conjuntos 2 a 2 em um sub-conjunto ordenado
As junes continuam at chegar a um conjunto nico
O qual estar ordenado
Rmulo Silva de Oliveira, DAS-UFSC, maio/2011
70
37
40
11
70
10
11
72
82
10
25
36
44
38
70
72
82
11
41
10
25
36
44
39
11
70
72
82
10
10
11
25
36
44
25
36
44
42
70
72
82
10
25
36
44
10
11
25
36
44
70
72
82
82
82
70
11
70
11
72
70
11
72
72
11
72
25
36
44
10
82
70
11
70
11
72
70
82
11
70
72
82
70
11
72
25
36
44
36
10
44
11
36
44
10
25
36
44
25
72
36
25
44
25
72
10
46
10
44
36
10
44
10
11
25
82
70
10
82
82
44
70
36
25
43
25
47
36
44
10
25
36
44
10
82
82
82
70
45
82
70
11
70
11
72
70
70
82
11
11
11
72
72
72
72
25
25
25
25
36
44
10
25
36
44
36
36
36
10
44
44
10
10
10
44
48
82
82
82
70
11
70
11
72
70
82
11
70
70
82
11
70
72
25
72
11
11
72
36
44
10
25
36
44
25
72
36
25
72
25
82
10
36
char
10
10
25
10
44
36
10
#include "sort.h"
44
36
*a = data, *m;
44
44
49
82
82
82
70
11
70
11
72
70
82
11
70
70
11
25
72
11
11
82
72
82
10
11
25
10
25
36
44
36
25
36
44
10
44
36
25
72
72
44
25
72
70
36
10
44
36
10
44
10
10
25
36
70
72
82
44
52
50
53
mgsort
int mgsort(void *data, int size, int esize, int i, int k,
int (*compare) (const void *key1, const void *key2));
Retorno
0 se a ordenao tiver sucesso, ou -1 caso contr rio.
Descrio
Usa merge sort para ordenar o array de elementos em data. O nmero de elementos
em data especificado por size. O tamanho de cada elemento especificado por
esize. Os argumentos i e k definem a diviso corrente sendo ordenada e inicialmente
devem ser 0 e size-1, respectivamente. O pointer para fun o compare especifica
uma funo definida por usurio para comparar elementos. Ela deve funcionar
como descrito para o issort. Quando mgsort retorna, data contem os elementos
ordenados.
}
memcpy(&a[i * esize], m, esize * ((k - i) + 1));
free(m);
return 0;
}
51
54
int j;
if (i < k) {
j = (int)(((i + k - 1)) / 2);
55
Ordenao
Insertion sort
58
Quicksort
Merge sort
Counting sort
Radix sort
56
59
57
60
4
4
65
4
5
62
64
4
5
61
63
4
6
66
#include "sort.h"
70
Quanto memria:
requer 2 arrays de tamanho n
e um array de tamanho k
68
71
Ordenao
Insertion sort
ctsort
int ctsort(int *data, int size, int k);
Retorno
Quicksort
Descrio
Usa counting sort para ordenar um array de inteiros em data. O nmero de inteiros
em data especificado por size. O argumento k especifica o mximo inteiro em
data, mais 1. Quando ctsort retorna, data contem os inteiros ordenados.
Merge sort
Counting sort
Radix sort
69
72
3
2
6
9
5
1
0
5
1
0
2
0
2
3
1
1
9
2
Produz {40, 12, 15, 16, 36, 49} ap s ordenar o digito menos significativo
e {12, 15, 16, 36, 40, 49} aps ordenar o dgito mais significativo
Rmulo Silva de Oliveira, DAS-UFSC, maio/2011
73
76
3
2
6
9
5
1
0
5
1
0
2
0
2
3
1
1
9
2
6
9
3
1
2
5
1
0
0
0
5
2
1
1
2
2
3
9
Estvel
Tempo linear
O maior dgito conhecido
Rmulo Silva de Oliveira, DAS-UFSC, maio/2011
74
77
6
9
3
1
2
5
1
0
0
0
5
2
1
1
2
2
3
9
9
3
1
6
2
5
0
0
0
1
5
2
1
2
2
1
3
9
75
78
9
3
1
6
2
5
0
0
0
1
5
2
1
2
2
1
3
9
1
2
3
5
6
9
0
5
0
2
1
0
#include "sort.h"
2
3
2
9
1
1
79
82
ou O (pn + pk )
80
83
rxsort
int rxsort(int *data, int size, int p, int k);
Retorno
0 se a ordenao teve sucesso, ou -1 caso contr rio.
Descrio
Usa radix sort para ordenar o array de inteiros em data. O nmero de inteiros em
data especificado por size. O argumento p especifica o nmero de posies de
dgitos em cada inteiro. O argumento k especifica a base num rica.Quando rxsort
retorna, data contem os inteiros ordenados.
81
84
Ordenao Sumrio
Insertion sort
Simples, ordena no lugar, melhor para ordena o incremental
Quicksort
Ordena no lugar, melhor no caso geral
Merge sort
Mesmo desempenho que quicksort, necessita o dobro da mem ria, permite
trabalhar com a diviso em partes dos dados originais
Counting sort
Algoritmo com tempo linear, trabalha com inteiros cujo maior valor conhecido
Radix sort
Algorimo com tempo linear, ordena d gito por dgito, bom para elementos de
tamanho fixo que podem ser quebrados em peda os, na forma de inteiros
85