2
2
3
3
Contribuidores
4
4
- Dromedario de chapeu
5
-
6
- O Quick Sort, é um dos algoritmos de ordenação padrões de se estudar.
5
+
6
+ O Quick Sort, é um dos algoritmos de ordenação padrões de se estudar.
7
7
Ele é famoso por ser relativamente eficiente na maioria dos casos, tendo
8
8
complexidade O(n log n). Porem em casos específicos ele pode chegar a ser
9
9
O(n²) nos piores casos, como a lista estar basicamente invertida por exemplo.
10
10
O Quick Sort adota a estrategia de "dividir e conquistar", que é resumidamente
11
11
dividir a lista em sub 2 listas e organizar essas sub listas. A cada execução
12
12
é escolhido o Pivot, e a partir deste Pivot nos comparamos todos os elementos
13
- da lista ate encontrar algum valor menor ou igual ao pivot, quando encontrarmos
14
- este valor, ele é colocado a frente do pivot. Quando passarmos por toda a
15
- lista, nos fazemos o swap entre o pivot e o ultimo índice que foi coloca a sua
16
- frene, assim nos teremos a garantia de que todos os itens a esquerda do pivot
17
- sejam menores, e os a direita maiores. E assim nos pegamos essas 2 novas listas,
13
+ da lista ate encontrar algum valor menor ou igual ao pivot, quando encontrarmos
14
+ este valor, ele é colocado a frente do pivot. Quando passarmos por toda a
15
+ lista, nos fazemos o swap entre o pivot e o ultimo índice que foi coloca a sua
16
+ frene, assim nos teremos a garantia de que todos os itens a esquerda do pivot
17
+ sejam menores, e os a direita maiores. E assim nos pegamos essas 2 novas listas,
18
18
e fazemos o mesmo processo.
19
19
20
20
Recomendo dar uma olhada mais profunda sobre o funcionado e casos específicos,
25
25
26
26
*/
27
27
28
-
29
28
// l = limite esquerdo
30
29
// r = limite direito
31
30
// É preciso indicar esses valores invés de gerar uma nova lista a cada divisão
@@ -38,18 +37,18 @@ fn partition(lista: &mut [i32], l: usize, r: usize) -> isize {
38
37
// Para colocarmos os valores menores ou iguais ao pivot na sua frente
39
38
// precisamos de uma variável pra contar quantos índices a frente colocar
40
39
// o novo valor a frente, para não ficarmos trocando o mesmo valor
41
- let mut count = l;
40
+ let mut count = l;
42
41
43
42
// For para fazer interação na lista. Não usamos enumerate pois precisamso
44
43
// simular as sub listas
45
- for j in l + 1 ..r + 1 {
44
+ for j in l + 1 ..r + 1 {
46
45
if lista[ j] <= pivot {
47
- count += 1 ;
48
- lista. swap ( count, j) ;
46
+ count += 1 ;
47
+ lista. swap ( count, j) ;
49
48
}
50
49
}
51
50
52
- // Trocamos o índice de pivot de lugar com o ultimo menor/igual valor, pois
51
+ // Trocamos o índice de pivot de lugar com o ultimo menor/igual valor, pois
53
52
lista. swap ( l, count) ;
54
53
55
54
// O índice onde apos a troca se encontra o Pivot é retornado, para que sirva
@@ -58,14 +57,14 @@ fn partition(lista: &mut [i32], l: usize, r: usize) -> isize {
58
57
return count as isize ;
59
58
}
60
59
61
- fn quick_sort ( lista : & mut [ i32 ] , l : isize , r : isize ) {
60
+ fn quick_sort ( lista : & mut [ i32 ] , l : isize , r : isize ) {
62
61
// A condição de parda da recuroa é caso tanto o extremo direito quanto esquerdo
63
62
// sejam iguais, ou sejá, a lista so tem 1 elemento
64
63
if l < r {
65
64
let indice_pivot = partition ( lista, l as usize , r as usize ) ;
66
65
quick_sort ( lista, l, indice_pivot - 1 ) ;
67
66
quick_sort ( lista, indice_pivot + 1 , r) ;
68
- }
67
+ }
69
68
}
70
69
71
70
fn printa ( lista : Vec < i32 > ) {
@@ -79,9 +78,9 @@ fn main() {
79
78
let mut lista = vec ! [ 1 , 6 , 3 , 9 , 3 , 8 , 5 , 2 , 7 ] ;
80
79
let len = lista. len ( ) as isize ;
81
80
82
- printa ( lista. clone ( ) ) ;
81
+ printa ( lista. clone ( ) ) ;
83
82
quick_sort ( & mut lista, 0 , len - 1 ) ;
84
- printa ( lista. clone ( ) ) ;
83
+ printa ( lista. clone ( ) ) ;
85
84
}
86
85
87
86
#[ cfg( test) ]
@@ -93,11 +92,11 @@ mod test {
93
92
let mut lista = vec ! [ 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ;
94
93
let len = lista. len ( ) as isize - 1 ;
95
94
quick_sort ( & mut lista, 0 , len) ;
96
- assert_eq ! ( vec![ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , lista) ;
95
+ assert_eq ! ( vec![ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , lista) ;
97
96
98
97
let mut lista = vec ! [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ;
99
98
let len = lista. len ( ) as isize - 1 ;
100
99
quick_sort ( & mut lista, 0 , len) ;
101
100
assert_eq ! ( vec![ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , lista) ;
102
101
}
103
- }
102
+ }
0 commit comments