Am vazut de multe ori scrise in 5~10 randuri sortari ineficiente. Cu un singur rand, se pot sorta elementele unui array foarte simplu si eficient, cu ajutorul functiei sort din biblioteca algorithm.
Functia sort primeste ca parametrii: adresa de memorie de la care sa inceapa sortarea, adresa de memorie unde sa se opreasca cu sortarea si optional un functor care sa decida criteriul de sortare.
Exemplu sortare in ordine crescatoare a elementelor de la jumatatea vectorului spre sfarsit:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> input = { 2, 5, 7, 6, 3, 4, 15, 11, 12, 18, 14, 27 , 5, 3, 12, 4 };
std::sort(input.begin() + input.size() / 2, input.end());
for (const auto& entry : input) {
std::cout << entry << " ";
}
return 0;
}
// out: 2 5 7 6 3 4 15 11 3 4 5 12 12 14 18 27
Exemplu sortare in ordine crescatoare a tuturor elementelor cu restricita ca elementele pare sa apara in stanga elementelor impare:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> input = { 2, 5, 7, 6, 3, 4, 15, 11, 12, 18, 14, 27 , 5, 3, 12, 4 };
auto ascending_even_left_odd_right = [](int a, int b) {
if (a % 2 == 0 && b % 2 == 1)
return 1;
if (a % 2 == 1 && b % 2 == 0)
return 0;
if (a < b)
return 1;
return 0;
};
std::sort(input.begin(), input.end(), ascending_even_left_odd_right);
for (const auto& entry : input) {
std::cout << entry << " ";
}
return 0;
}
// out: 2 4 4 6 12 12 14 18 3 3 5 5 7 11 15 27
Pentru aprofundare, abordeaza urmatoarele probleme:
EASY: sorteaza in ordine descrescatoare toate elementele
MEDIUM: sorteaza in ordine crescatoare prima jumatate si in ordine descrescatoarea a 2-a jumatate
HARD: sorteaza in zig-zag, primele 4 elemente crescator, urmatoarele 4 descrescator, urmatoarele 4 crescator si tot asa
Pentru inrebari, va astept cu un reply sau cu un PM in cazul in care topicul este inchis. Bafta!