Website Summary Files Commits Branches @commit @diff @stats
path: root / Seminar02 / src
diff options
context:
space:
mode:
Commitdd9a7bf0fdcc3a04fcfb18ba1613d91b46ef0833 (patch)
Author
 Stoycho Kyosev <skyosev@192.168.100.17>
2024-10-20 07:47:14 -0400
Committer
 Stoycho Kyosev <skyosev@192.168.100.17>
2024-10-20 07:47:14 -0400
Files0e517f48f127dc1cb5418dacc61e48959ad34eb4 /Seminar02/src
Data-structures-and-algorithms-dd9a7bf0fdcc3a04fcfb18ba1613d91b46ef0833.tar
Data-structures-and-algorithms-dd9a7bf0fdcc3a04fcfb18ba1613d91b46ef0833.tar.gz
Data-structures-and-algorithms-dd9a7bf0fdcc3a04fcfb18ba1613d91b46ef0833.zip
Parent8b287b482452f58491a2e1514cb37aa27b05929a (diff)
Add Sem02
diff --git a/Seminar02/src/sorting-algorithms/merge-sort-dummy.cpp b/Seminar02/src/sorting-algorithms/merge-sort-dummy.cpp
new file mode 100644
index 0000000..b5b2b1c
--- /dev/null
+++ b/Seminar02/src/sorting-algorithms/merge-sort-dummy.cpp
@@ -0,0 +1,54 @@
+#include <iostream>
+
+template<typename T>
+void merge(T* arr1, unsigned len1,
+ T* arr2, unsigned len2)
+{
+ T* resultArray = new T[len1 + len2];
+
+ unsigned cursor1 = 0;
+ unsigned cursor2 = 0;
+ unsigned resultCursor = 0;
+
+ while (cursor1 < len1 && cursor2 < len2)
+ {
+ if (arr1[cursor1] <= arr2[cursor2])
+ resultArray[resultCursor++] = arr1[cursor1++];
+ else
+ resultArray[resultCursor++] = arr2[cursor2++];
+ }
+
+ while (cursor1 < len1)
+ resultArray[resultCursor++] = arr1[cursor1++];
+
+ while (cursor2 < len2)
+ resultArray[resultCursor++] = arr2[cursor2++];
+
+ for (size_t i = 0; i < len1 + len2; i++)
+ arr1[i] = resultArray[i];
+
+ delete[] resultArray;
+}
+
+template <typename T>
+void mergeSort(T* arr, unsigned len)
+{
+ if (len < 2)
+ return;
+
+ unsigned mid = len / 2;
+
+ mergeSort(arr, mid);
+ mergeSort(arr + mid, len - mid);
+
+ merge<T>(arr, mid, arr + mid, len - mid);
+}
+
+int main()
+{
+ int arr[4] = { 9, 6, 5, 8 };
+ mergeSort(arr, 4);
+
+ for (int i = 0; i < 4; i++)
+ std::cout << arr[i] << " ";
+} \ No newline at end of file
diff --git a/Seminar02/src/sorting-algorithms/merge-sort.cpp b/Seminar02/src/sorting-algorithms/merge-sort.cpp
new file mode 100644
index 0000000..3ae3c09
--- /dev/null
+++ b/Seminar02/src/sorting-algorithms/merge-sort.cpp
@@ -0,0 +1,87 @@
+#include <iostream>
+#include <vector>
+#include <algorithm>
+
+template<class T>
+void merge(T* firstArray, unsigned firstSize,
+ T* secondArray, unsigned secondSize,
+ T* buffer)
+{
+ unsigned firstIter = 0;
+ unsigned secondIter = 0;
+ unsigned resultIter = 0;
+
+ while(firstIter < firstSize && secondIter < secondSize)
+ {
+ if(firstArray[firstIter] > secondArray[secondIter])
+ {
+ buffer[resultIter] = secondArray[secondIter];
+ secondIter++;
+ }
+ else
+ {
+ buffer[resultIter] = firstArray[firstIter];
+ firstIter++;
+ }
+ resultIter++;
+ }
+
+ while(firstIter < firstSize)
+ {
+ buffer[resultIter++] = firstArray[firstIter++];
+ }
+
+ while(secondIter < secondSize)
+ {
+ buffer[resultIter++] = secondArray[secondIter++];
+ }
+
+ for (size_t i = 0; i < firstSize + secondSize; i++)
+ {
+ firstArray[i] = buffer[i];
+ }
+}
+
+
+template<class T>
+void mergeSortStep(T* arr, unsigned size, T* buffer)
+{
+ if(size < 2)
+ return;
+
+ unsigned mid = size / 2;
+ mergeSortStep(arr, mid, buffer);
+ mergeSortStep(arr + mid, size - mid, buffer);
+
+ merge(arr, mid, arr + mid, size - mid, buffer);
+
+ for (size_t i = 0; i < size; i++)
+ arr[i] = buffer[i];
+}
+
+template<class T>
+void mergeSort(T* arr, unsigned size)
+{
+ if(size < 2)
+ return;
+
+ T* buffer = new T[size];
+ mergeSortStep(arr, size, buffer);
+ delete[] buffer;
+}
+
+int main()
+{
+ std::vector<int> numbers;
+ unsigned size = rand() % 10000;
+ numbers.resize(size);
+
+ for (size_t i = 0; i < size; i++)
+ {
+ numbers[i] = rand() % 10000;
+ }
+
+ mergeSort(numbers.data(), numbers.size());
+
+ std::cout << std::is_sorted(numbers.begin(), numbers.end()) << std::endl;
+} \ No newline at end of file
diff --git a/Seminar02/src/sorting-algorithms/quick-sort.cpp b/Seminar02/src/sorting-algorithms/quick-sort.cpp
new file mode 100644
index 0000000..3069738
--- /dev/null
+++ b/Seminar02/src/sorting-algorithms/quick-sort.cpp
@@ -0,0 +1,65 @@
+#include <iostream>
+#include <algorithm> // std::is_sorted
+#include <vector> // std::vector
+
+/// @brief Reorders the elements in such a way that all elements for which are less than pivot
+// precede all elements which are greater or equal to pivot. Relative order of the elements is not preserved.
+// TODO: remove copy somehow???
+template <class T>
+size_t partition(T* pArr, size_t len)
+{
+ if (pArr[0] > pArr[len - 1])
+ std::swap(pArr[0], pArr[len - 1]);
+
+ T& partitioningElement = pArr[len - 1];
+ size_t left = 0;
+ size_t right = len - 1;
+
+ while (true)
+ {
+ while (pArr[++left] < partitioningElement)
+ ;
+
+ while (pArr[--right] > partitioningElement)
+ {
+ if (left == right)
+ break;
+ }
+
+ if (left >= right)
+ break;
+
+ std::swap(pArr[left], pArr[right]);
+ }
+
+ std::swap(pArr[left], partitioningElement);
+ return left;
+}
+
+template<class T>
+void quickSort(T* arr, unsigned size)
+{
+ if(size < 2)
+ return;
+
+ unsigned pivotPos = partition(arr, size);
+
+ quickSort(arr, pivotPos);
+ quickSort(arr + pivotPos + 1, size - pivotPos - 1);
+}
+
+int main()
+{
+ std::vector<int> numbers;
+ unsigned size = rand() % 10000;
+ numbers.resize(size);
+
+ for (size_t i = 0; i < size; i++)
+ {
+ numbers[i] = rand() % 10000;
+ }
+
+ quickSort(numbers.data(), numbers.size());
+
+ std::cout << std::is_sorted(numbers.begin(), numbers.end());
+} \ No newline at end of file