Sortowanie
Lekcja 19 z 23 w kursie C++ – Standardowa biblioteka szablonów w Coddy.
Sortowanie to ogólnie pojęcie oznaczające przestawianie elementów kontenera w logicznej kolejności.
Sortowanie jest jedną z najbardziej podstawowych i fundamentalnych technik stosowanych do przetwarzania danych za pomocą funkcji. Oznacza to, że sortowanie pozwala nam ułożyć sekwencję elementów w określony, wybrany przez nas sposób, zgodnie z logiczną kolejnością.
Algorytmy sortowania pomagają manipulować danymi, a także rozwiązywać wiele problemów matematycznych i programistycznych.
*Aby używać tych metod, musimy dołączyć plik nagłówkowy algorithm na początku pliku C++ za pomocą #include <algorithm>.
Poznasz wbudowane funkcje z biblioteki algorytmów STL, które służą do sortowania danych.
Omówimy trzy funkcje:
sort()is_sorted()partial_sort()
Metoda sort
Metoda sort() z STL sortuje zawartość podanego zakresu. Metoda wymaga iteratora początkowego i końcowego, a następnie sortuje elementy z tego zakresu w kolejności rosnącej.
Możemy użyć jej w dwóch wersjach:
sort(starting_iterator, ending_iterator)— sortuje zakres określony przez iteratory w kolejności rosnącejsort(starting_iterator, ending_iterator, comparing_function)— sortuje zakres określony przez iteratory, ale według funkcji podanej jako trzeci parametr
vector<int> numbers = {3, 5, 1, 2, 4};
sort(numbers.begin(), numbers.end());
for(auto i = numbers.begin(); i != numbers.end(); i++)
cout << *i << " ";Output:
1 2 3 4 5Jak widać w powyższym kodzie, metoda sort() posortowała wektor w kolejności rosnącej.
bool compare(int a, int b)
{
return a > b; // zwróć 1, jeśli a jest większe od b
}
int main()
{
vector<int> numbers = {3, 5, 1, 2, 4};
sort(numbers.begin(), numbers.end(), compare);
for(auto i = numbers.begin(); i != numbers.end(); i++)
cout << *i << " ";Output:
5 4 3 2 1Widać więc, jak użyliśmy drugiej wersji metody sort. Tworzymy funkcję compare() tak, aby zwracała true, jeśli a jest większe od b. Dzięki temu możemy sortować wektor w kolejności malejącej.
Metoda is_sorted
Metoda is_sorted() to funkcja STL, która zwraca true lub false, zależnie od tego, czy podany zakres jest posortowany.
Metoda is_sorted() ma również dwie wersje, dokładnie tak jak metoda sort():
is_sorted(starting_iterator, ending_iterator)— sprawdza, czy zakres określony przez dwa iteratory jest posortowany w kolejności rosnącej; zwraca true, jeśli tak, a w przeciwnym razie zwraca falseis_sorted(starting_iterator, ending_iterator, comparing_function)— sprawdza, czy zakres określony przez dwa iteratory jest posortowany według funkcji porównującej.
vector<int> numbers = {3, 5, 1, 2, 4};
cout << is_sorted(numbers.begin(), numbers.end()) << endl;
sort(numbers.begin(), numbers.end());
cout << is_sorted(numbers.begin(), numbers.end());Output:
0
1bool compare(int a, int b)
{
return a > b; // zwróć 1, jeśli a jest większe od b
}
int main()
{
vector<int> numbers = {3, 5, 1, 2, 4};
cout << is_sorted(numbers.begin(), numbers.end(), compare) << endl;
sort(numbers.begin(), numbers.end(), compare);
cout << is_sorted(numbers.begin(), numbers.end(), compare);Output:
0
1Metoda partial_sort
Metoda parital_sort() sortuje pierwszą połowę elementów w podanym zakresie, a pozostałe elementy pozostawia w pierwotnym stanie.
Ma również dwie wersje:
partial_sort(start, middle, end)— sortuje zakres od start do end w taki sposób, że elementy od iteratora początkowego do iteratora środkowego są posortowane w kolejności rosnącej, a elementy od iteratora środkowego do iteratora końcowego pozostają w pierwotnym staniepartial_sort(start, middle, end, compare)— sortuje zakres od start do end tak, że elementy od start do middle są sortowane według funkcji porównującej, a elementy od middle do end pozostają w pierwotnym stanie
vector<int> numbers = {3, 5, 1, 2, 4, 10, 7};
partial_sort(numbers.begin(), numbers.begin() + 4, numbers.end());
for(auto i = numbers.begin(); i != numbers.end(); i++)
cout << *i << " ";Output:
1 2 3 4 5 10 7bool compare(int a, int b)
{
return a > b; // zwróć 1, jeśli a jest większe od b
}
int main()
{
vector<int> numbers = {3, 5, 1, 2, 4, 10, 7};
partial_sort(numbers.begin(), numbers.begin() + 3, numbers.end(), compare);
for(auto i = numbers.begin(); i != numbers.end(); i++)
cout << *i << " ";Output:
10 7 5 1 2 3 4Jak widać, metoda partial_sort() działa nieco inaczej, ale nie przejmuj się tym — rzadko będziesz używać sortowania częściowego.
Na razie zapamiętaj, czym jest sortowanie, dobrze zapamiętaj metody sort() i is_sorted() oraz poćwicz ich używanie.
Wyzwanie
ŚredniPodano liczbę N z wejścia. W następnym wierszu znajduje się N liczb. Wypisz najpierw liczby w kolejności rosnącej, a następnie w kolejności malejącej, oddzielając je pojedynczą spacją.
Input
3
5 15 10Output
5 10 15 15 10 5Spróbuj swoich sił
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// Enter your code here
int main()
{
// Enter your code here
return 0;
}Wszystkie lekcje w sekcji C++ – Standardowa biblioteka szablonów
Poćwicz samodzielnie: Kompilator C++ online