CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
commit 230cdd512490b47f3df24fe2fc2a15e3a5a952c3
parent 5fb12b2ec35b56614167a55d9373bb21a01c5d26
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Tue,  2 Apr 2024 00:23:14 -0300

Add solutions for problem 9 and 10

Diffstat:
Aguias/3/ej09.cpp | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aguias/3/ej10.cpp | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 125 insertions(+), 0 deletions(-)
diff --git a/guias/3/ej09.cpp b/guias/3/ej09.cpp
@@ -0,0 +1,68 @@
+// Taken from https://github.com/mjkloeckner/sav.git
+
+#include <iostream>
+#include <vector>
+
+#define VECTOR_ELEMENT_LIMIT    20
+
+void vector_random_populate(std::vector<int>& v) {
+    srand (time(NULL));
+    for(size_t i = 0; i < v.size(); ++i)
+        v[i] = (int)(rand() % VECTOR_ELEMENT_LIMIT);
+}
+
+void vector_print(const std::vector<int> v) {
+    std::cout << "[";
+    for(size_t i = 0; i < v.size(); ++i) {
+        std::cout << v[i] << ((v.size() == i+1) ? "" : ", ");
+    }
+    std::cout << "]\n";
+}
+
+void merge(std::vector<int>& v, int low, int middle, int high) {
+    size_t n1, n2, i, j, k;
+
+    n1 = middle - low;
+    n2 = high - middle;
+
+    int B[n1], C[n2];
+
+    /* B holds middle low array */
+    for(i = low, j = 0; i < middle; i++, j++)
+        B[j] = v[i];
+
+    /* C middle high */
+    for(i = middle, j = 0; i < high; i++, j++)
+        C[j] = v[i];
+
+    /* merge B and C in order */
+    for(k = low, i = j = 0; (k < high) && (i < n1) && (j < n2); k++)
+        v[k] = ((B[i] <= C[j]) ? v[k] = B[i++] : C[j++]);
+
+    while(i < n1)
+        v[k++] = B[i++];
+
+    while(j < n2)
+        v[k++] = C[j++];
+}
+
+
+void merge_sort(std::vector<int>& v, int low, int high) {
+    int middle = ((high + low) / 2);
+
+    if((high - low) > 1) {
+        merge_sort(v, low, middle);
+        merge_sort(v, middle, high);
+        merge(v, low, middle, high);
+    }
+}
+
+int main (void) {
+    std::vector<int> v(10);
+    vector_random_populate(v);
+    vector_print(v);
+    merge_sort(v, 0, v.size());
+    vector_print(v);
+
+    return 0;
+}
diff --git a/guias/3/ej10.cpp b/guias/3/ej10.cpp
@@ -0,0 +1,57 @@
+#include <iostream>
+#include <vector>
+
+#define VECTOR_ELEMENT_LIMIT    20
+
+void vector_random_populate(std::vector<int>& v) {
+    srand (time(NULL));
+    for(size_t i = 0; i < v.size(); ++i)
+        v[i] = (int)(rand() % VECTOR_ELEMENT_LIMIT);
+}
+
+void vector_print(const std::vector<int> v) {
+    std::cout << "[";
+    for(size_t i = 0; i < v.size(); ++i) {
+        std::cout << v[i] << ((v.size() == i+1) ? "" : ", ");
+    }
+    std::cout << "]\n";
+}
+
+void swap(int *a, int *b)
+{
+    int tmp;
+    tmp = (*a);
+    (*a) = (*b);
+    (*b) = tmp;
+}
+
+void quick_sort_partition(std::vector<int> &v, int low, int &middle, int high) {
+    int i, j, pivot;
+    pivot = high;
+
+    for(i = j = low; i < high; i++)
+        if(v[i] < v[pivot])
+            swap(&v[j++], &v[i]);
+
+    swap(&v[j], &v[pivot]);
+    middle = j;
+}
+
+void quick_sort(std::vector<int>& v, int low, int high) {
+    int pivot;
+
+    if ((high - low) > 0) {
+        quick_sort_partition(v, low, pivot, high);
+        quick_sort(v, low, pivot - 1);
+        quick_sort(v, pivot + 1, high);
+    }
+}
+
+int main (void) {
+    std::vector<int> v(10);
+    vector_random_populate(v);
+    vector_print(v);
+    quick_sort(v, 0, v.size());
+    vector_print(v);
+    return 0;
+}