Inserción Ordenada
La idea de este algoritmo es poder insertar un elemento dentro de un vector, manteniendo el orden del mismo
/*
* PRE: tope < MAX_ELEMENTOS
* Inserta 'elemento' en 'vector', respetando el orden.
*/
void insertar_ordenado(vector_t vector, int *tope, elemento_t elemento){
int i = *tope;
while (i > 0 && vector_ordenado[i-1] > elemento){
vector[i] = vector[i-1]
i--;
}
vector[i] = elemento;
(*tope)++;
}Eliminación Ordenada
La idea de este algoritmo es eliminar un elemento dentro de un vector, sin dejar huecos en el medio.
/*
* Elimina 'elemento' de 'vector', si existe.
*/
void eliminar_ordenado(vector_t vector, int *tope, elemento_t elemento){
int pos = -1;
int i = 0;
while (i < *tope && pos == -1){
if(vector[i] == elemento){
pos = i;
}
}
if (pos != -1){
(*tope)--;
for(i = pos; i < tope; i++){
vector[i]=vector[i+1];
}
}
}Búsqueda Lineal
La búsqueda lineal busca sucesivamente cada elemento de un arreglo, hasta encontrar el elemento buscado
/*
* POST:
* / indice del elemento si lo encuentra.
* / -1 si no lo encuentra.
*
* Busca el elemento ingresado en el vector.
*/
int busqueda_lineal(vector_t vector, int tope, elemento_t elemento_buscado){
int pos = -1;
int i = 0;
while (i < tope && pos == -1){
if(vector[i] == elemento){
pos = i;
}
i++;
}
return pos;
}Búsqueda Binaria
La búsqueda binaria es un algoritmo más eficiente para buscar elementos, cuando los elementos del arreglo están ordenados.
/*
* POST:
* / indice del elemento si lo encuentra.
* / -1 si no lo encuentra.
*
* Busca el elemento ingresado en el vector.
*/
int busqueda_binaria(vector_t vector, int tope, elemento_t elemento_buscado){
int centro;
int inicio = 0;
int fin = tope-1;
int pos = -1;
while (inicio <= fin && pos == -1){
centro = (fin+inicio)/2;
if (elemento_buscado == vector[centro]){
pos == centro;
} else if (elemento_buscado < vector[centro]){
fin = centro-1;
} else {
inicio = centro+1;
}
}
return pos;
}Mezcla
La mezcla consiste en tomar todos los valores de ambos arreglos
void mezcla(vector_t vectorA, int topeA, vector_t vectorB, int topeB,
vector_t vectorC, int *topeC){
int i = 0;
int j = 0;
*topeC = 0;
while (i < topeA && j < topeB){
if (arregloA[i] <= arregloB[j]){
resultado[*topeC] = arregloA[i];
i++;
} else {
resultado[*topeC] = arregloB[j];
j++;
}
(*topeC)++;
}
while (i < topeA){
resultado[*topeC] = arregloA[i];
i++;
(*topeC)++;
}
while (j < topeB){
resultado[*topeC] = arregloB[j];
j++;
(*topeC)++;
}
}Unión
La unión es similar a la mezcla, pero el resultado no tendrá elementos repetidos
void union(vector_t vectorA, int topeA, vector_t vectorB, int topeB,
vector_t vectorC, int *topeC){
int i = 0;
int j = 0;
*topeC = 0;
while (i < topeA && j < topeB){
if (arregloA[i] < arregloB[j]){
resultado[*topeC] = arregloA[i];
i++;
} else if (arregloA[i] > arregloB[j]){
resultado[*topeC] = arregloB[j];
j++;
} else {
resultado[*topeC] = arregloA[i];
i++;
j++;
}
(*topeC)++;
}
while (i < topeA){
resultado[*topeC] = arregloA[i];
i++;
(*topeC)++;
}
while (j < topeB){
resultado[*topeC] = arregloB[j];
j++;
(*topeC)++;
}
}Diferencia
La diferencia entre y , toma los valores de que no están en
void diferencia(vector_t vectorA, int topeA, vector_t vectorB, int topeB,
vector_t vectorC, int *topeC){
int i = 0;
int j = 0;
*topeC = 0;
while (i < topeA && j < topeB){
if (arregloA[i] < arregloB[j]){
resultado[*topeC] = arregloA[i];
i++;
(*topeC)++;
} else if (arregloA[i] > arregloB[j]){
j++;
} else {
i++;
j++;
}
}
while (i < topeA){
resultado[*topeC] = arregloA[i];
i++;
(*topeC)++;
}
}Intersección
La intersección devuelve los elementos que se encuentran en ambos conjuntos
void diferencia(vector_t vectorA, int topeA, vector_t vectorB, int topeB,
vector_t vectorC, int *topeC){
int i = 0;
int j = 0;
*topeC = 0;
while (i < topeA && j < topeB){
if (arregloA[i] == arregloB[j]){
resultado[*topeC] = arregloA[i];
i++;
(*topeC)++;
} else if (arregloA[i] < arregloB[j]){
i++;
} else {
j++;
}
}
}