Попробуйте книги Страуструпа, или Шилдта. Что касается уменьшения количества проходов в пузырьковой сортировке - это фактически разработка нового алгоритма (в данном случае это, конечно, достаточно тривиально, но при наличии выработанного аналитического мышления, когда можешь не напрягаясь представить себе работу алгоритма, что не годится для человека, который только начал учиться кодить).
Мой совет такой:
Если учитесь сами, начните с какого-нибудь простого языка, типа python или php (но он сильно заточен под web). Первое, что необходимо это начать писать и, соответсвенно, начать думать как програмист. После чего можно браться за сложные языки, и разбираться как они работают.
Если собираетесь быть профессиональным програмистом - идите в технический вуз на соответсвующую специальность (програмировать вас там особо не научат, но научат правильно думать и дадут хорошую математическую базу).
Для того что бы развиваться в програмировании надо работать програмистом, надо постоянно получать задачи, которые в данный момент не можете решить и штурмовать их. Оптимальный вариант - получить работу стажера, что бы еще и иметь возможность проконсультироваться со старшими товарищами.