как отсортировать массив на c++
мне нужно отсортировать массив как в задании а, но мой код выдает ошибку, как ее исправить
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int getRandomNumber(int a, int b) {
return rand() % (b - a + 1) + a;
}
void reverseArray(int arr[], int size) {
for (int i = 0; i < size / 2; i++) {
sort(arr.begin() + i, arr.begin() + size - i - 1, greater<int>());
}
}
int main() {
setlocale(LC_ALL, "rus");
int n, a, b;
int sum = 0, sum1 = 0;
cout << "Введите размер массива: ";
cin >> n;
if (n <= 0) {
cout << "Размер массива должен быть положительным числом!" << endl;
return 0;
}
cout << "Введите первый элемент диапазона: ";
cin >> a;
if (a < 0 || a > 100) {
std::cout << "Некорректный первый элемент диапазона!";
return 0;
}
cout << "Введите последний элемент диапазона: ";
cin >> b;
if (b < 0 || b > 100) {
cout << "Некорректный последний элемент диапазона!";
return 0;
}
if (a > b) {
cout << "Первый элемент диапазона должен быть меньше или равен последнему!";
return 0;
}
int* arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = getRandomNumber(a, b);
cout << arr[i] << " ";
}
reverseArray(arr, n); // Реверс массива
cout << "\nРеверсированный массив: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
delete[] arr;
return 0;
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
P.S. Вы привели свой некомпилируемый код, спросили об ошибке компиляции. Постепенно началось обычное "дайте воды попить, а то так есть хочется, что и переночевать негде" — выцыганить полное решение.
Нет уж. "Вернулся старик от синего моря, а перед ним его старуха с разбитым корытом" (с)
sort(arr + i, arr + size - i - 1, greater<int>());
Вот так ваш код компилируется.
А первоначальный ответ я удалил.
Автор решения: NunOfIt
→ Ссылка
В соответствие с заданием, вам не нужно ничего сортировать, вам просто нужно выполнить ревёрс элементов первой и второй части массива, т.е. поствить их в обратном порядке. Пример: [7, 4, -3, 1, 0, 12] -> [-3, 4, 7, 12, 0, 1]
#include <ctime>
#include <clocale>
#include <cstdlib>
#include <iostream>
#include <exception>
class Random {
int _start, _end, _mod;
public:
Random(): Random(0, 0) {}
Random(int start, int end) {
(void) set(start, end);
std::srand((unsigned int) std::time(NULL));
}
int generate() { return rand() % _mod + _start; }
template<typename T>
void fill(T& arr) {
for(auto& el: arr)
el = generate();
}
// Getters
int get_end() const { return _end; }
int get_start() const { return _start; }
// Setters
void set_end(int val) { (void) set(_start, val); }
void set_start(int val) { (void) set(val, _end); }
void set(int start, int end) {
if(start > end)
throw std::invalid_argument("Значение end должно быть больше либо равно start!");
_end = end;
_start = start;
_mod = end - start + 1;
}
};
class Array {
int* _arr;
int _size;
static constexpr int DEFAULT_SIZE = 8;
public:
Array(): Array(DEFAULT_SIZE) {}
Array(int size) {
if(size <= 0)
throw std::invalid_argument("Размер массива должен быть натуральным числом!");
(void) _set(size);
}
Array(const Array& other) { (void) _set(other); }
~Array() { delete[] _arr; }
void shift() {
int temp = _arr[0];
for(int i = 1; i < _size; ++i)
_arr[i - 1] = _arr[i];
_arr[_size - 1] = temp;
}
void reverse(int start, int end) {
(void) _index_out_of_range_exception(end);
(void) _index_out_of_range_exception(start);
int temp;
for(; start < end; ++start, --end) {
temp = _arr[start];
_arr[start] = _arr[end];
_arr[end] = temp;
}
}
int size() const { return _size; }
int& operator[](int index) {
(void) _index_out_of_range_exception(index);
return _arr[index];
}
explicit operator bool() const { return bool(_size); }
int* begin() { return _arr; }
int* end() { return _arr + _size; }
friend std::ostream& operator<<(std::ostream&, const Array&);
private:
void _set(int size) {
_size = size;
_arr = new int[size]{};
}
void _set(const Array& other) {
(void) _set(other._size);
for(int i = 0; i < other._size; ++i)
_arr[i] = other._arr[i];
}
void _index_out_of_range_exception(int index) {
if(index < 0 || index >= _size)
throw std::out_of_range("index out of range!");
}
};
std::ostream& operator<<(std::ostream& out, const Array& other) {
out << '[';
if(other) {
out << other._arr[0];
for(int i = 1; i < other._size; ++i)
out << ", " << other._arr[i];
}
out << ']';
return out;
}
void scan(int (&data)[3]) {
std::cout << "Введите размер массива: ";
std::cin >> data[0];
std::cout << "Введите начальное значение диапозона: ";
std::cin >> data[1];
std::cout << "Введите конечное значение диапозона: ";
std::cin >> data[2];
std::cout << '\n';
}
void exA(int (&data)[3], Random& rnd) {
std::cout << "Задание А:\n\n";
(void) scan(data);
Array arr(data[0]);
rnd.set(data[1], data[2]);
rnd.fill(arr);
std::cout << "Массив: " << arr << '\n';
arr.shift();
std::cout << "Результат: " << arr << '\n';
}
void exB(int (&data)[3], Random& rnd) {
std::cout << "Задание В:\n\n";
(void) scan(data);
if(data[0] & 1)
throw std::domain_error("Размер массива должен быть чётным!");
Array arr(data[0]);
rnd.set(data[1], data[2]);
rnd.fill(arr);
std::cout << "Массив: " << arr << '\n';
int mid = arr.size() / 2;
arr.reverse(0, mid - 1);
arr.reverse(mid, arr.size() - 1);
std::cout << "Результат: " << arr << '\n';
}
int main()
{
std::setlocale(LC_ALL, "rus");
Random rnd;
int data[3];
(void) exA(data, rnd);
std::cout << '\n';
(void) exB(data, rnd);
return 0;
}
