-
Notifications
You must be signed in to change notification settings - Fork 1
/
sorting.cpp
146 lines (111 loc) · 2.8 KB
/
sorting.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// input output
#include <iostream>
#include <limits>
//
#include <time.h>
// util per riempire array di lunghezza arbitraria
void randFill(int array[], int length, int range)
{
srand(time(NULL));
for (int i = 0; i < length; i++)
{
array[i] = rand() % range;
}
}
// util per stampare array di lunghezza arbitraria
void printArray(int array[], int length)
{
for (int i = 0; i < length; i++)
{
std::cout << array[i] << std::endl;
}
}
// util per scambiare elementi di un array
void swap(int& one, int& two) {
int t = one;
one = two;
two = t;
}
// algoritmo di ordinamento exchange sort
int* exchangeSort(int array[], int length)
{
for (int i = 0; i < length; i++)
{
for (int j = i; j < length; j++)
{
if (array[j] < array[i])
{
// se il nuovo valore è minore, allo faccio swap
/* int temp = array[i];
array[i] = array[j];
array[j] = temp; */
swap(array[i], array[j]);
}
}
}
return array;
}
int* bubbleSort(int array[], int length) {
for(int i = 0; i < length; i++) {
for (int j = 0; j<length-1; j++) {
if(array[j+1] < array[j]) {
swap(array[j], array[j+1]);
}
}
}
return array;
}
// algoritmo di ordinamento exchange sort
int* selectionSort(int array[], int length)
{
for (int i = 0; i < length; i++)
{
int min = std::numeric_limits<float>::infinity();
int index = i;
for (int j = i; j < length; j++)
{
if (array[j] < min)
{
min = array[j];
index = j;
}
}
swap(array[i], array[index]);
}
return array;
}
// algoritmo countingSort, uno degli algoritmi di ordinamento per numeri non-general purpose più veloci che esistano
// implementazione per numeri positivi.
int* countingSort(int array[], int length) {
int max = 0;
for(int i = 0; i < length; i++) {
if( array[i] > max) {
max = array[i];
}
}
int counter[max+1] = {};
for(int i = 0; i < length; i++) {
counter[array[i]]++;
}
// insert
int index = 0;
for(int i = 0; i < max+1; i++) {
// std::cout << counter[i] << "-";
if(counter[i] > 0) {
for(int j = 0; j < counter[i]; j++) {
array[index] = i;
index++;
}
}
}
return array;
}
int main() {
int array[] = {3,7,34,7,3,12,199,0,2,0,1,2};
selectionSort(array, sizeof(array)/sizeof(array[0]));
// countingSort(array, sizeof(array)/sizeof(array[0]));
for(int i : array) {
std::cout << i << " - ";
}
return 0;
}