Пора углубляться в сортировки и после сортировки пузырьком мы изучим сортировку вставками.
Как работает эта сортировка?Представьте, что у нас есть массив, разделенный на две части, одна часть отсортированная, а друга нет. Мы теперь не пробегаемся по отсортированному массиву (в отличие от сортировки пузырьком), а идем по массиву, который не отсортирован и говорим:
- Если элемент неотсортированного массива больше, чем последний элемент отсортированного массива, то ничего не трогаем.
- Если элемент оказался меньше, чем последний элемент отсортированного массива, то меняем неотсортированный элемент до тех пор, пока он не станет больше какого-либо (возможно никакого, тогда он окажется в самом начале массива) элемента.
На самом деле, если вам кажется, что сортировка вставками намного быстрее, чем сортировка пузырьком, то вы заблуждаетесь) Потому что если у нас массив изначально отсортирован по убыванию, и мы, когда запустим сортировку вставками от такого массива (а наша сортировка сортирует по возрастанию), то асимптотика такого алгоритма будет O(N * N), потому что каждый новый неотсортированный элемент мы будет засовывать в начало массива => пробегаться по всему массиву заново.
Вот код:
int n = 5; // количество элементов в массиве
vector<int> x = {8, 1, 3, 4, 0}; // сам массив
for (int i = 1; i < n; i++) {
for (int j = i; j > 0 && x[j - 1] > x[j]; j--) { // пока j > 0 и элемент j-1 > j
swap(x[j - 1], x[j]); // меняем местами
}
}
// Вывод массива
for (int i = 0; i < n; ++i) {
cout << x[i] << " ";
}
Я решил еще решить задачку с помощью метода сортировки вставками:

Ссылка на задачу
Я бы порекомендовал бы вам самим попробовать решить эту задачку именно методом сортировки вставками, но кто вообще слушает рекомендации?)
Решение#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
int n, max_s;
cin >> n >> max_s;
vector<int> x(n); // массив на n элементов
for (int i = 0; i < n; ++i) {
cin >> x[i]; // ввод элементов
}
for (int i = 1; i < n; i++) {
for (int j = i; j > 0 && x[j - 1] > x[j]; j--) { // пока j > 0 и элемент j-1 > j
swap(x[j - 1], x[j]); // меняем местами
}
}
int sum = 0; // наша сумма
for (int i = n - 1; i >= n - max_s; --i) { //
if (sum + x[i] > sum){ // так как предметы могут быть отрицательными, то проверяем, что мы взяли положительный
sum += x[i];
}
}
cout << sum;
return 0;
}
На этом все, надеюсь вам было интересно :)