-
Notifications
You must be signed in to change notification settings - Fork 0
/
mergeIntCrescente.cpp
73 lines (61 loc) · 1.69 KB
/
mergeIntCrescente.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
#include <iostream>
/*
Descricao: apartir de um vetor de inteiros, essa
funcao subdivide o vetor em outros dois e intercala
seus elementos entre si no vetor principal
Parametros: um vetor de inteiros (vetor a ser intercalado) e
3 inteiros (o primeiro, o ultimo e o indice do elemento do
meio do vetor)
*/
void intercalar (int vet[], int esq, int meio, int dir) {
int nEsq = (meio - esq) + 1;
int nDir = dir - meio;
int arrayEsq[nEsq+1];
int arrayDir[nDir+1];
//Sentinela no final dos dois arrays
arrayEsq[nEsq] = 0x7FFFFFFF;
arrayDir[nDir] = 0x7FFFFFFF;
int iEsq, iDir, i;
//Inicializar primeiro subarray
for (iEsq = 0; iEsq < nEsq; iEsq++){
arrayEsq[iEsq] = vet[esq+iEsq];
}
//Inicializar segundo subarray
for (iDir = 0; iDir < nDir; iDir++){
arrayDir[iDir] = vet[(meio + 1) + iDir];
}
//Intercalacao propriamente dita
for (iEsq = 0, iDir = 0, i = esq; i <= dir; i++){
if (arrayEsq[iEsq] <= arrayDir[iDir]) {
vet[i] = arrayEsq[iEsq];
iEsq++;
} else {
vet[i] = arrayDir[iDir];
iDir++;
}
}
}
/*
Descricao: essa funcao ordena um vetor de inteiros
em ordem crescente com o metodo mergesort
Parametro: um vetor de inteiros (vetor a ser ordenado)
e dois inteiros (indice do primeiro e do ultimo elemento do vetor)
*/
void merge (int vet[], int esq, int dir) {
if (esq < dir) {
int meio = (esq + dir) /2;
merge(vet, esq, meio);
merge(vet, meio + 1, dir);
intercalar(vet, esq, meio, dir);
}
}
/*
Descricao: essa funcao chama pela funcao merge
para ordena o vetor em ordem crescente, possuindo
argumentos mais simplificados
Parametro: um vetor de inteiros (vetor a ser ordenado)
e um inteiro (tamanho do vetor)
*/
void mergesort (int vet[], int n) {
merge (vet, 0, n-1);
}