сортировать массив без условных

Мне нужна программа, которая сортирует массив целых чисел без использования условных операторов. Числа находятся в диапазоне от 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’ поврежден.

Есть ли способ это исправить?

3

Решение

Проблема в том, что ваш код записывает после конца массива. Это происходит после того, как вы встретили последний элемент в подсчитанной последовательности, но перед массивом 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 (демонстрация).

3

Другие решения

Логика второго цикла неверна. У вас есть шесть номеров arr, не удваивается, что означает, что в общей сложности шесть элементов buf будет установлен в 1,

Это означает, что через некоторое время значение i будет 6, который вы затем используете в качестве индекса в arr, но индекс 6 это седьмой элемент в массиве, ведущий вас писать вне границ.

2