template<typename T>
void selection_sort(vector<T>& a) {
for (int i = 0; i < a.size() - 1; i++) {
int min = i;
for (int j = i + 1; j < a.size(); j++)
if (a[j] < a[min])
min = j;
swap(a[i], a[min]);
}
}
template<typename T>
void bubble_sort(vector<T> & a) {
for (int i = 0; i < a.size() - 1; i++) {
for (int j = 0; j < a.size() - 1 - i; j++) {
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
}
}
template<typename T>
void insert_sort(vector<T> & a) {
for (int i = 1; i < a.size(); i++) {
for (int j = i - 1; j >= 0 && a[j + 1] < a[j]; j--)
swap(a[j], a[j + 1]);
}
}
template<typename T>
void merge_sort(int l ,int r ,vector<T> & a) {
if (r - l == 1) return;//Note '=='
int m = l + r >> 1;
merge_sort(l, m, a);
merge_sort(m, r, a);
static vector<T> tmp(a.size(),0);
int p = l, q = m, i = p;
while (p < m || q < r) {
if (q >= r || (p < m && a[p] < a[q])) {
tmp[i++] = a[p++];
}
else {
tmp[i++] = a[q++];
}
}
for (int i = l; i < r; i++)
a[i] = tmp[i];
}
template<typename T>
void quick_sort(int l, int r, vector<T>& a) {
if (r - l <= 1) return;//Note '<='
int j = l - 1;
for (int i = l; i < r; i++) {
if (a[i] < a[r - 1]) {
j += 1;
swap(a[i], a[j]);
}
}
j++;
int m = j;
swap(a[j], a[r - 1]);
quick_sort(l, m, a);
quick_sort(m + 1, r, a);
}
int main()
{
vector<int> a = { 2,8,7,1,3,5,6,4 };
//selection_sort(a);
//bubble_sort(a);
//insert_sort(a);
//merge_sort(0, a.size(), a);
//quick_sort(0, a.size(), a);
for (int i : a)cout << i << " "; cout << endl;
return 0;
}