Причина, по которой код не работает должным образом, в два раза
- , потому что ваш алгоритм разрушителен
- , потому что вы пересекаете границы массива
ваш фрагмент кода:
if(input1[i]<input1[i+1]) // <-- 2) over step array when i = (input2 - 1)
{
small = input1[i];
input1[i+1] = small; // <-- 1) this will overwrite the NEXT value
}
else
{
small = input1[i+1];
input1[i+1] = small;
}
если вы пройдете через это с вашим входом arrayInt
int arrayInt[5] = {65,43,2,898,678};
данные станут {65, 43, 2, 2, 2} по мере их выполнения,уничтожение исходных данных.
c и c ++ используют индексирование базы 0, то есть массив из 4 элементов индексируется 0, 1, 2, 3 и т. д., поэтому при выполнении итерации «i
|пункт 0 |пункт 1 |пункт 2 |пункт 3 |пункт 4 |etc.
ссылка на input1 [5] просто вернет следующий блок памяти, интерпретируемый как ожидаемый тип данных, целое число в случае arrayInt.
Поскольку 3 массива объявляются вместе,компилятор выделил их пространство вместе, это означает, что arrayInt находится рядом с arrayInf в физической памяти, что также означает, что arrayInt [5] будет таким же, как (int) arrayInf [0].4.5 float - это большое целое число, которое задействует деструктивную природу вашего алгоритма. Это означает, что при переборе массиваInt вы на самом деле перезаписали 4.5 float с целым числом 2, и это будет интерпретироваться как действительно маленькое число с плавающей запятой.первый элемент массива arrayInf.
@ Bo-r дает пример лучшего алгоритма для выполнения того, что вы хотите.