-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathselection_sort.cpp
76 lines (67 loc) · 1.44 KB
/
selection_sort.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
#include <iostream>
#include <utility> // std::swap()
#include <vector>
// O(n * n)
template<typename Comparable>
void SelectionSort(const int size, Comparable* const outData)
{
for(int i = 0; i < size - 1; i++)
{
int least = i;
for(int j = i + 1; j < size; j++)
{
if(*(outData + j) < *(outData + least))
{
least = j;
}
}
if(i != least) // if the elements in data are large compound entities such as arrays or structures
{ // then one swap may take much time so using a conditional swap() is recommended.
std::swap(*(outData + least), *(outData + i));
}
}
}
template<typename Comparable>
void SelectionSort(std::vector<Comparable>* outData)
{
size_t size{ outData->size() };
for(size_t i = 0; i < size; i++)
{
size_t least = i;
for(size_t j = i + 1; j < size; j++)
{
if(outData->at(j) < outData->at(least))
{
least = j;
}
}
if(i != least)
{
std::swap(outData->at(least), outData->at(i));
}
}
}
template<typename T>
void Swap(T* const outFirst, T* const outSecond) // same as std::swap()
{
T tmp{ std::move(*outFirst) };
*outFirst = std::move(*outSecond);
*outSecond = std::move(tmp);
}
int main()
{
int a1[7]{ 8, 6, 4, 4, 1, 9, 2 };
SelectionSort(7, a1);
std::vector<int> a2{ 5, 3, 1, 2, 9, 8, 7 };
SelectionSort(&a2);
for(const auto& x : a1)
{
std::cout << x << ' ';
}
std::cout << '\n';
for(const auto& x : a2)
{
std::cout << x << ' ';
}
std::cout << '\n';
}