C++
Std: sort, обычный массив и vector
Для сортировки массива в C++ чаще всего используют std::sort из заголовка <algorithm>. Это стандартный способ: он короче, надежнее и быстрее учебной ручной сортировки в большинстве обычных задач
Минимальный пример:
#include <algorithm>
#include <iostream>
int main() {
int numbers[] = {5, 2, 9, 1, 7};
std::sort(numbers, numbers + 5);
for (int number : numbers) {
std::cout << number << " ";
}
return 0;
}
Вывод:
1 2 5 7 9
Первый аргумент std::sort — начало диапазона, второй — конец диапазона. Конец не включается в сортировку. Для массива из 5 элементов это numbers + 5
Как не писать размер вручную
Если компилятор поддерживает C++17, можно использовать std::size:
#include <algorithm>
#include <iostream>
#include <iterator>
int main() {
int numbers[] = {5, 2, 9, 1, 7};
std::sort(numbers, numbers + std::size(numbers));
for (int number : numbers) {
std::cout << number << " ";
}
return 0;
}
Так безопаснее: если элементов станет больше, не придется менять число вручную
Сортировка vector
В современном C++ вместо обычного массива часто используют std::vector. Он хранит размер внутри себя и удобнее для задач, где количество элементов может меняться
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {5, 2, 9, 1, 7};
std::sort(numbers.begin(), numbers.end());
for (int number : numbers) {
std::cout << number << " ";
}
return 0;
}
Результат будет таким же:
1 2 5 7 9
Сортировка по убыванию
Чтобы отсортировать по убыванию, передайте третий аргумент — функцию сравнения. Для чисел можно использовать std::greater<int>()
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {5, 2, 9, 1, 7};
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
for (int number : numbers) {
std::cout << number << " ";
}
return 0;
}
Вывод:
9 7 5 2 1
Сортировка строк
std::sort работает не только с числами:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> names = {"Ivan", "Anna", "Oleg"};
std::sort(names.begin(), names.end());
for (const std::string& name : names) {
std::cout << name << "\n";
}
return 0;
}
Строки будут отсортированы по лексикографическому порядку
Когда нужна ручная сортировка
Ручную сортировку пузырьком или выбором имеет смысл писать в учебной задаче, когда преподаватель просит показать алгоритм. В реальном коде лучше брать std::sort
Пример учебной сортировки пузырьком:
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (a[j] > a[j + 1]) {
std::swap(a[j], a[j + 1]);
}
}
}
Но если нет требования писать алгоритм вручную, этот вариант проигрывает стандартному
Частые ошибки
Забыть include
Для std::sort нужен заголовок:
#include <algorithm>
Для std::greater нужен:
#include <functional>
Передать неправильный конец диапазона
Правильно:
std::sort(numbers, numbers + 5);
Неправильно:
std::sort(numbers, numbers + 4);
Во втором случае последний элемент не попадет в сортировку
Короткий вывод
Для сортировки массива в C++ используйте std::sort. Для обычного массива передавайте указатели на начало и конец, для std::vector — begin() и end(). Ручную сортировку оставляйте для учебных задач по алгоритмам
Связанные материалы:
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- std::generate в C++: как заполнить vector и массив
- Массивы в C++: обычный массив, vector и базовые операции
- length в C++: длина строки, vector, массива и C-строки
- Как передать массив в функцию C++: размер, vector, array и span