Skip to content

Commit 1768dc0

Browse files
committed
<init> first commit
0 parents  commit 1768dc0

12 files changed

+184
-0
lines changed

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
cmake-build-debug
2+
inputs

Diff for: .idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .idea/inspectionProfiles/Project_Default.xml

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .idea/misc.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .idea/ordenamiento.iml

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
cmake_minimum_required(VERSION 3.22)
2+
project(ordenamiento)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
6+
add_executable(ordenamiento main.cpp)
7+
8+
add_executable(generate generate.cpp counting_sort.h)
9+
10+
add_executable(test test.cpp counting_sort.h)

Diff for: counting_sort.h

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#ifndef ORDENAMIENTO_COUNTING_SORT_H
2+
#define ORDENAMIENTO_COUNTING_SORT_H
3+
4+
#include <iostream>
5+
#include <fstream>
6+
#include <ctime>
7+
#include <cmath>
8+
#include <chrono>
9+
10+
// enteros de 0 a k
11+
void counting_sort(int *a, int size) {
12+
int k = 0;
13+
// 1. encontrar el maximo elemento
14+
for (int i = 0; i < size; ++i) {
15+
k = std::max(a[i], k);
16+
}
17+
k++;
18+
// 2. crear arreglo auxiliar
19+
int *c = new int[k];
20+
for (int i = 0; i < k; ++i) {
21+
c[i] = 0;
22+
}
23+
// 3. contar apariciones de cada elemento
24+
for (int i = 0; i < size; ++i) {
25+
c[a[i]]++;
26+
}
27+
// 4. acumular cuenta
28+
for (int i = 1; i < k; ++i) {
29+
c[i] = c[i] + c[i-1];
30+
}
31+
// 5. crear nuevo arreglo
32+
int *b = new int[size];
33+
for (int i = size - 1; i >= 0; --i) {
34+
b[c[a[i]] - 1] = a[i];
35+
c[a[i]]--;
36+
}
37+
std::copy(b, b + size, a);
38+
delete[] b;
39+
delete[] c;
40+
}
41+
42+
#endif //ORDENAMIENTO_COUNTING_SORT_H

Diff for: generate.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <iostream>
2+
#include <fstream>
3+
#include <ctime>
4+
#include <cmath>
5+
#include <chrono>
6+
7+
8+
void generate_input_files(int n) {
9+
srand(time(NULL));
10+
std::ofstream outfile("../inputs/" + std::to_string(n) + ".in");
11+
for (int i = 0; i < n; ++i) {
12+
outfile << rand() % n << "\n";
13+
}
14+
outfile.close();
15+
}
16+
17+
void generate_files() {
18+
for (int i = 10; i <= pow(10, 7); i *= 10) {
19+
generate_input_files(i);
20+
}
21+
}
22+
23+
int main() {
24+
auto start = std::chrono::high_resolution_clock::now();
25+
generate_files();
26+
auto end = std::chrono::high_resolution_clock::now();
27+
double duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
28+
std::cout << "Ejecucion exitosa en " << duration * 1e-9 << " s" << std::endl;
29+
return 0;
30+
}

Diff for: main.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include <iostream>
2+
3+
#include "counting_sort.h"
4+
5+
template<int size>
6+
void print_array(int (&a)[size]) {
7+
for (int i = 0; i < size; ++i) {
8+
std::cout << a[i] << " ";
9+
}
10+
std::cout << "\n";
11+
}
12+
13+
int main() {
14+
// ejemplo 1
15+
int a1[] = {18, 17, 6, 2, 18, 6, 14};
16+
print_array(a1);
17+
counting_sort(a1, 7);
18+
print_array(a1);
19+
// ejemplo 2
20+
int a2[] = {39, 34, 11, 17, 42, 40, 44, 31, 19};
21+
print_array(a2);
22+
counting_sort(a2, 9);
23+
print_array(a2);
24+
}
25+

Diff for: results.csv

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
n,duration(ns)
2+
10,1300
3+
100,2400
4+
1000,17700
5+
10000,202300
6+
100000,1.4043e+006
7+
1000000,1.11738e+007
8+
10000000,1.46628e+008

Diff for: test.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "counting_sort.h"
2+
#include <fstream>
3+
4+
void run_test(int n, std::ofstream &results) {
5+
std::ifstream infile("../inputs/" + std::to_string(n) + ".in");
6+
if (!infile.is_open()) {
7+
std::cout << "Error." << std::endl;
8+
return;
9+
}
10+
std::string buf;
11+
int *a = new int[n];
12+
int i = 0;
13+
while (std::getline(infile, buf)) {
14+
a[i] = std::stoi(buf);
15+
++i;
16+
}
17+
auto start = std::chrono::steady_clock::now();
18+
counting_sort(a, n);
19+
auto end = std::chrono::steady_clock::now();
20+
double duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
21+
results << n << "," << duration << "\n";
22+
delete[] a;
23+
}
24+
25+
int main() {
26+
std::ofstream results("../results.csv");
27+
results << "n,duration(ns)" << "\n";
28+
for (int i = 10; i <= pow(10, 7); i *= 10) {
29+
run_test(i, results);
30+
}
31+
}

0 commit comments

Comments
 (0)