Мне нужна программа, которая сортирует массив целых чисел без использования условных операторов. Числа находятся в диапазоне от 0 до 100 и не повторяются.
#include <iostream>
using namespace std;
int main() {
int arr[] = { 34, 12, 24, 65, 63, 22 };
int arraySize = (sizeof(arr) / sizeof(*arr));
unsigned char buf[101] = { 0 };
for (int k = 0; k < arraySize; k++) {
buf[arr[k]]++;
}
unsigned char i = 0;
for (int k = 0; k <= 100; k++) {
arr[i] = k;
i += buf[k];
}
for (int a : arr) {
cout << a << endl;
}
system("pause");
return 0;
}
Эта программа работает, но я получаю сообщение об ошибке после закрытия командной строки:
Ошибка проверки времени выполнения № 2 — стек вокруг переменной ‘arr’ поврежден.
Есть ли способ это исправить?
Проблема в том, что ваш код записывает после конца массива. Это происходит после того, как вы встретили последний элемент в подсчитанной последовательности, но перед массивом buf
был исчерпан, т.е.
for (int k = 0; k <= 100; k++) {
arr[i] = k;
i += buf[k];
}
Когда вы добавляете самый высокий элемент, который составляет 65, к результату, i
достигает 6, так что назначение a[i]
становится незаконным. Посмотрите, что происходит, добавив дополнительный элемент в ваш массив, установив для него значение -1 и наблюдая, что с ним происходит (для него установлено значение 100; демо 1).
Вы можете исправить это, добавив условие досрочного выхода для остановки, как только вы заполнили массив обратно, т.е.
for (int k = 0; i < arraySize && k <= 100; k++) {
arr[i] = k;
i += buf[k];
}
Теперь -1 после конца «активной» части нашего массива остается -1 (демонстрация).
Логика второго цикла неверна. У вас есть шесть номеров arr
, не удваивается, что означает, что в общей сложности шесть элементов buf
будет установлен в 1
,
Это означает, что через некоторое время значение i
будет 6
, который вы затем используете в качестве индекса в arr
, но индекс 6
это седьмой элемент в массиве, ведущий вас писать вне границ.