diff options
author | Santo Cariotti <santo@dcariotti.me> | 2022-11-11 11:07:40 +0100 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2022-11-11 11:07:40 +0100 |
commit | a5534f16ecaf4b93f1bcd775f1e1df64203b3b65 (patch) | |
tree | 7418b6d85cbda3a769bbd0e885a9498547401f49 /Year_2 | |
parent | e402f549e8101bcddb6181b8b8b42d10e217c780 (diff) |
Add `ordinamento-lineare`
Diffstat (limited to 'Year_2')
-rw-r--r-- | Year_2/Algorithms/data_structures/cc/ordinamento-lineare.cc | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/Year_2/Algorithms/data_structures/cc/ordinamento-lineare.cc b/Year_2/Algorithms/data_structures/cc/ordinamento-lineare.cc new file mode 100644 index 0000000..5af1b1d --- /dev/null +++ b/Year_2/Algorithms/data_structures/cc/ordinamento-lineare.cc @@ -0,0 +1,115 @@ +#include <fstream> +#include <iostream> +#include <stdlib.h> +#include <string> + +using namespace std; + +template <typename T> +void +counting_sort(T* A, size_t n, ofstream& fout, int incr, bool is_char = false) +{ + int i, j; + int max, min; + int* freq; + int* t; + int range; + + for (i = 0; i < n; ++i) { + A[i] = A[i] * incr; + } + + max = A[0], min = A[0]; + t = new int[n]; + + for (i = 1; i < n; ++i) { + if (A[i] > max) + max = A[i]; + + if (A[i] < min) + min = A[i]; + } + + range = (max - min) + 1; + + freq = new int[range]; + + for (i = 0; i < range; ++i) { + freq[i] = 0; + } + + for (i = 0; i < n; ++i) { + freq[static_cast<int>(A[i] - min)] += 1; + } + for (i = 1; i < range; ++i) { + freq[i] = freq[i] + freq[i - 1]; + } + fout << "0 "; + for (i = 0; i < range - 1; ++i) { + fout << freq[i] << ' '; + } + + for (i = n - 1; i >= 0; --i) { + t[freq[static_cast<int>(A[i] - min)] - 1] = A[i]; + freq[static_cast<int>(A[i] - min)]--; + } + + for (i = 0; i < n; ++i) { + A[i] = t[i]; + if (is_char) { + fout << (char)A[i] << ' '; + } else { + fout << A[i] / incr << ' '; + } + } + fout << endl; + + delete[] freq; + delete[] t; +} + +int +main() +{ + ifstream fin("input.txt"); + ofstream fout("output.txt"); + string type; + int N; + + for (int i = 0; i < 100; ++i) { + fin >> type; + fin >> N; + + if (type == "double") { + double* a = new double[N]; + + for (int j = 0; j < N; ++j) { + fin >> a[j]; + } + + counting_sort(a, N, fout, 10); + + delete[] a; + } else if (type == "char") { + char* a = new char[N]; + + for (int j = 0; j < N; ++j) { + fin >> a[j]; + } + + counting_sort(a, N, fout, 1, true); + delete[] a; + } else { + int* a = new int[N]; + + for (int j = 0; j < N; ++j) { + fin >> a[j]; + } + + counting_sort(a, N, fout, 1); + delete[] a; + } + } + + return 0; +} |