Почему код работает по-разному?
Смысл алгоритма: два указателя, которые двигаются слева направо.
Второй всегда правее первого.
Сравниваются два элемента массива под указателями. Меняются местами при необходимости.

Вот визуализация сортировки:snippet
Потому что второй код неправильный.
Если хочешь разобраться почему - дебаггер тебе в руки и вперёд!

P.S. почему 10/2 делится нормально, а 10/0 возникает ошибка? Надо запилить вопрос на тостере