Программа на C++ для поиска третьего наименьшего числа: методы сортировки, линейного поиска и очереди по приоритетам

Чтобы найти третье наименьшее число в C++, можно использовать несколько методов. Вот некоторые из них:

Метод 1: сортировка

  1. В качестве входных данных возьмите массив или контейнер чисел.
  2. Отсортируйте массив или контейнер по возрастанию.
  3. Обратитесь к элементу по индексу 2 (при условии, что индексация начинается с нуля), чтобы получить третье наименьшее число.
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
    std::vector<int> numbers = {5, 2, 9, 1, 7, 3};
    std::sort(numbers.begin(), numbers.end());

    if (numbers.size() >= 3) {
        int thirdSmallest = numbers[2];
        std::cout << "Third smallest number: " << thirdSmallest << std::endl;
    } else {
        std::cout << "Not enough numbers to find the third smallest." << std::endl;
    }
    return 0;
}

Метод 2: линейный поиск

  1. В качестве входных данных возьмите массив или контейнер чисел.
  2. Инициализируйте три переменные: smallest, SecondSmallestи ThirdSmallestс большими значениями.
  3. Перебрать каждый элемент массива или контейнера.
  4. Сравните каждый элемент с текущими значениями smallest, SecondSmallestи ThirdSmallest, обновив их при необходимости.
  5. После перебора всех элементов значение ThirdSmallestбудет третьим наименьшим числом.
#include <iostream>
#include <vector>
int main() {
    std::vector<int> numbers = {5, 2, 9, 1, 7, 3};
    int smallest = INT_MAX;
    int secondSmallest = INT_MAX;
    int thirdSmallest = INT_MAX;
    for (int i = 0; i < numbers.size(); i++) {
        if (numbers[i] < smallest) {
            thirdSmallest = secondSmallest;
            secondSmallest = smallest;
            smallest = numbers[i];
        } else if (numbers[i] < secondSmallest && numbers[i] != smallest) {
            thirdSmallest = secondSmallest;
            secondSmallest = numbers[i];
        } else if (numbers[i] < thirdSmallest && numbers[i] != smallest && numbers[i] != secondSmallest) {
            thirdSmallest = numbers[i];
        }
    }
    if (thirdSmallest != INT_MAX) {
        std::cout << "Third smallest number: " << thirdSmallest << std::endl;
    } else {
        std::cout << "Not enough numbers to find the third smallest." << std::endl;
    }
    return 0;
}

Метод 3: приоритетная очередь

  1. В качестве входных данных возьмите массив или контейнер чисел.
  2. Создайте приоритетную очередь (минимальную кучу) для хранения чисел.
  3. Пройтись по каждому элементу массива или контейнера и вставить его в приоритетную очередь.
  4. Извлечь первые два элемента из приоритетной очереди.
  5. Элемент, остающийся в верхней части приоритетной очереди, будет иметь третий наименьший номер.
#include <iostream>
#include <queue>
#include <vector>
int main() {
    std::vector<int> numbers = {5, 2, 9, 1, 7, 3};
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
    for (int num : numbers) {
        pq.push(num);
    }
    if (pq.size() >= 3) {
        pq.pop();
        pq.pop();
        int thirdSmallest = pq.top();
        std::cout << "Third smallest number: " << thirdSmallest << std::endl;
    } else {
        std::cout << "Not enough numbers to find the third smallest." << std::endl;
    }
    return 0;
}