-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tarefa7IC2.cpp
127 lines (97 loc) · 2.98 KB
/
Tarefa7IC2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
/*
Aluno: Pedro Henrique Mendes de LIma
N° USP: 13823051
Seja um registro (estrutura) com os campos: nome (string) e número de inscrição (int).
Pede-se
a. Faça uma função para ordenar, via QuickSort, um vetor com N registros. A
ordenação deve ser de acordo com o número de inscrição;
b. Imprima na tela o número de comparações entre chaves, movimentações de
registros e chamadas da função recursiva realizadas pelo algoritmo. Utilize
contadores para isso.
c. Mostre os números de comparações e movimentações e desenhe as respectivas
árvores de recursão para as 3 sequências a seguir (no qual apenas o número de
inscrição é apresentado):
45 56 12 43 95 19 8 67
8 12 19 43 45 56 67 95
95 67 56 45 43 19 12 8
*/
struct dados
{
int numInscricao;
string Nome;
};
void ordQuickSort(int *vetor, int esquerda, int direita, int *count);
int main()
{
int n, *vetor;
int *count = (int *)calloc(2, sizeof(int)); //count[0] é atribuicoes ou mudancas e count[1] sao as comparacoes.
cout << "Entre com o o tamanho do vetor \n";
cin >> n;
dados *D1 = new dados[n];
vetor = (int *)calloc(n, sizeof(int));
for (int i = 0; i < n; i++)
{
cout << " Coloque o numero de inscricao para o registro numero: " << i + 1 << "\n";
cin >> D1[i].numInscricao;
//cout << " Coloque o nome do registro numero: " << i + 1 << "\n";
//cin >> D1[i].Nome;
}
for (int i = 0; i < n; i++)
{
vetor[i] = D1[i].numInscricao;
}
ordQuickSort(vetor, 0, n, count);
cout << "\n";
for(int i = 0; i<n; i++){
cout << vetor[i] << ", ";
}
cout << "\n\n Numero de comparacoes: " << count[1] << "\n Numero de atribuicoes: " << count[0];
return 0;
}
void ordQuickSort(int *vetor, int esquerda, int direita, int *count)
{
//int *count = (int *)calloc(2, sizeof(int)); //count[0] é atribuicoes ou mudancas e count[1] sao as comparacoes.
int i, j, pivo, aux;
i = esquerda;
j = direita - 1;
pivo = vetor[(esquerda + direita) / 2];
count[0] +=3;
while (i <= j)
{
count[1] +=1;
while (vetor[i] < pivo && i < direita)
{
i++;
count[1] +=1;
count[0] +=1;
}
while (vetor[j] > pivo && j > esquerda)
{
j--;
count[1] +=1;
count[0] +=1;
}
if (i <= j)
{
aux = vetor[i];
vetor[i] = vetor[j];
vetor[j] = aux;
i++;
j--;
count[1] +=1;
count[0] +=5;
}
}
if(j > esquerda){
count[1] +=1;
ordQuickSort(vetor, esquerda, j+1, count);
}
if(i < direita){
count[1] +=1;
ordQuickSort(vetor, i, direita, count);
}
}