<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blogee</title>
	<atom:link href="https://blogee.ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://blogee.ru</link>
	<description>Ad Astra Per Aspera</description>
	<lastBuildDate>Thu, 23 Dec 2021 17:10:39 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.2</generator>
	<item>
		<title>50+ идей Pet-проектов для программиста часть 2</title>
		<link>https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82-2/</link>
					<comments>https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82-2/#respond</comments>
		
		<dc:creator><![CDATA[Artem]]></dc:creator>
		<pubDate>Sun, 19 Dec 2021 15:11:02 +0000</pubDate>
				<category><![CDATA[Учебные проекты]]></category>
		<guid isPermaLink="false">https://blogee.ru/?p=122</guid>

					<description><![CDATA[<p> WEB-проекты Система бронирования. Предметная область может быть абсолютно любой. Карта с недвижимостью и арендой/покупкой. Системы бронирования билетов на самолет, кино. Бронирование столиков в ресторане. Запись куда-либо на определенное время. В общем, полет фантазии тут безграничен, и задача встречается часто и в реальной жизни. Социальная сеть. Хоть некоторые и говорят: &#171;Только не делайте очередную социальную сеть&#187;. ...</p>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82-2/">50+ идей Pet-проектов для программиста часть 2</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="entry">
<h3> WEB-проекты</h3>
<h6>Система бронирования.</h6>
<p>Предметная область может быть абсолютно любой. Карта с недвижимостью и арендой/покупкой. Системы бронирования билетов на самолет, кино. Бронирование столиков в ресторане. Запись куда-либо на определенное время. В общем, полет фантазии тут безграничен, и задача встречается часто и в реальной жизни.</p>
<h6>Социальная сеть.</h6>
<p>Хоть некоторые и говорят: &#171;Только не делайте очередную социальную сеть&#187;. А почему бы и нет ? Это вполне хорошая практика. Главное подходить к этому разумно и не представлять после каждой строчки написанного кода дрожащего Цукерберга) Если вас интересует бэкенд, можете легко найти готовый шаблон чтобы не отвлекаться на это и реализовать базовый функционал. Заодно попрактикуетесь в проектировании базы данных. Развивать функционал тут можно бесконечно долго, но это уже не будет оправдано, банально не хватит ресурсов. Ни технических ни финансовых. Не говоря о том, что пытаясь вывести такой проект в массы нужно с первых дней особое внимание уделять безопасности, что для пет-проекта не так принципиально.</p>
<h6>Онлайн-магазин.</h6>
<p>Есть масса готовых движков для создания интернет-магазинов, однако и по сей день многие компании пишут функционал с нуля. Это очень хороший для практики проект, особенно если вы попытаетесь добавить в проект различные платежные инструменты.</p>
<h6>Поисковик.</h6>
<p>Собственно да, поисковая система а-ля Google или Yahoo. На этом проекте можно сполна и до тошноты наиграться в классические алгоритмы, чего на других проектах не всегда можно увидеть. После того как за несколько часов мы запилим более крутой дизайн чем у Ларри Пейджа, начинается самое интересное. Итак, у нас есть титульник поисковика, есть гараж, он даже чуть больше чем был у Google в начале пути, нужно лишь выкатить из него дедов москвич.</p>
<p>Для начала нам нужен поисковый робот который будет обходить сайты, причем заходя не только на титульную страницу, но и обходить вглубь. И вот одна только эта задача уже требует принять массу решений, как обходить, какие данные вытаскивать, как определять веса и значимости страниц, как определять что мы тут уже были по другой ссылке. Как определять что страница с описанием конкретного автомобиля при поиске важнее чем страница с общим каталогом автомобилей где также описана эта модель. Нужно подсчитывать внешние ссылки, входящие ссылки, строить деревья и как-то ранжировать сайты и между собой.</p>
<p>В общем, лучше всего здесь будет выбрать какую-то определенную категорию, например авто-тематики и сделать поисковик исключительно тематическим и по заранее определенной группе сайтов. А то у вас просто не хватит ресурсов и вычислительных мощностей чтобы обойти все сайты интернета и взять с них какую-то информацию. Я даже не говорю о том что это ещё надо как-то ранжировать и регулярно переобходить и перестраивать эти самые деревья и связи. В конце концов в Google работает около 90 тысяч человек и в их распоряжении более миллиона серверов, нужно реально оценивать свои возможности.</p>
<h6>Чат-бот / бот в мессенджерах.</h6>
<p>А также боты для социальных сетей. Вы сталкивались с ними везде и они сейчас довольно популярны. Функционал может быть любой, от регистрации где-то в чем-то, до консультаций с переводом управления на человека. В общем, вещь на сегодня довольно востребованная.</p>
<h6>Спам фильтр.</h6>
<p>Ох уж этот спам, он повсюду, начиная от кучи мусора в вашем почтовом ящике и заканчивая сообщениями в социальных сетях. Этот проект может стать частью некоторых других описанных в этом же разделе. Либо как самостоятельная единица. Нужно определиться с тем, что такое спам, как именно отличить нормальное письмо от спама. На самом деле, тема не такая и простая и даже самые крутые спам-фильтры время от времени ошибаются. Можете реализовать простое приложение которое получает письма с какого-то почтового ящика и уже на этих письмах тренироваться.</p>
<h6>Движок форума.</h6>
<p>Форумы были невероятно популярны до появления социальных сетей. Собственно они людям и заменяли эти самые социальные сети и люди там неплохо общались. Из популярных на тот момент движков могу вспомнить флагманский vBulletin, чуть более простой Invision Power Board и бесплатный phpBB. Если взять статистику по миллиону самых популярных сайтов, но последние лет 10-12 форумы стабильно теряли своию аудиторию. Тем не менее, форумы живее всех живых, а при попытке нагуглить что-то по программированию, в топе наверняка окажутся именно те самые форумы.</p>
<p>Собственно, сложность задачки лежит на том уровне до которого вы решите копать. Минимальный функционал форума это возможность создавать темы, заходить в эти темы, отвечать на определенные сообщения с цитироваинем или без. Как минимум должно быть 2 пользовательские группы, админы и пользователи, можете добавить ещё модераторов или супер-меодераторов. Если ранее делали свой спам-фильтр, то он тут будет очень даже к месту. Только не пытайтесь сделать сразу все возможные кнопки и фишки форумов. Не забывайте что ваш проект должен иметь законченный вид. И всё что вы там &#171;визуально заявите&#187; должно работать.</p>
<h6>Движок блога</h6>
<p>Вы можете попробовать написать свой простенький движок блога, по типу WordPress или Joomla. На каком-то базовом уровне проект не особо сложный, но здесь также можно копать очень глубоко. Начиная от создания простых записей и возможности регистрации авторизации. И двигаться в сторону прав доступа, возможности загрузки файлов, созданию плагинов, системы загрузки тем и шаблонов.</p>
<h6>Свой инстаграмм.</h6>
<h6>Автопостинг в социальных сетях</h6>
<h6>FTP-клиент</h6>
<h6>Система контент менеджента (CMS)</h6>
<p>В современном мире почти не осталось сайтов которые редактируются путем непосредственного изменения кода страниц. Этим управляет CMS. Система управления контентом &#8212; это система, позволяющая любому количеству людей управлять различным контентом на сайте, обычно это статьи, макет, реклама и т.д. В принципе, по своей сути это не особо отличается от движка блога и даже википедия в качестве примеров выдает wordpress и joomla. Но CMS это не только блоги, это может быть вообще что угодно. Это именно система управления контентом, а уж в какой области эту систему реализовывать, решать вам.</p>
<h6>Доска объявлений</h6>
<p>Все вы конечно же знаете Авито и Юлу, помимо них есть и множество других. Современные доски объявлений продвинулись довольно далеко от того на что они были похожи в середине нулевых. Но вот тот базовый функционал простых объявления разложенных по разным категориям вам вполне доступен для реализации на старте. А при особом желании, имея базовый функционал уже можно замахнуться и на грандов.</p>
<h6>Собственная капча</h6>
<p>Вряд ли эта капча будет интересна ещё кому-то кроме вас, всё же на сегодняшний день популярно мучать пользователей рекапчей от гугла. Но как практика вполне сойдет, тем более что реализовывается это довольно просто.</p>
<h6>Rss ридер</h6>
<p>Проект исключительно попрактиковаться в плане парсинга данных и представлении этих данных в каком-то более удобном виде. RSS-ленты сегодня уже мало где применяются.</p>
<p><strong>Почта</strong></p>
<p><strong>Чат</strong></p>
<h5>Игры</h5>
<p>1. Крестики-нолики.</p>
<p>2. Тетрис</p>
<p>3. Змейка</p>
<p>4. Морской бой</p>
<p>5. Клон Марио</p>
<p>6. Тамагочи</p>
<p>7. Флоппи берд</p>
<p>8. Ангри берд</p>
<h5>Arduino/Raspberry</h5>
<p>Умный дом</p>
</div>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82-2/">50+ идей Pet-проектов для программиста часть 2</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title> 50+ идей Pet-проектов для программиста часть 1</title>
		<link>https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82/</link>
					<comments>https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82/#respond</comments>
		
		<dc:creator><![CDATA[Artem]]></dc:creator>
		<pubDate>Sun, 19 Dec 2021 15:08:48 +0000</pubDate>
				<category><![CDATA[Учебные проекты]]></category>
		<guid isPermaLink="false">https://blogee.ru/?p=120</guid>

					<description><![CDATA[<p>50+ идей Pet-проектов для резюме и прокачки навыков Всем привет ! Как известно, научиться чему-либо без практики невозможно и программирование не исключение. Но что именно реализовывать и какие проекты брать ? На самом деле довольно популярный вопрос и единого мнения на этот счет нет. Одни говорят &#8212; &#171;Только не создавайте очередную социальную сеть/движок блога или ...</p>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82/"> 50+ идей Pet-проектов для программиста часть 1</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="entry">
<h3>50+ идей Pet-проектов для резюме и прокачки навыков</h3>
<p>Всем привет ! Как известно, научиться чему-либо без практики невозможно и программирование не исключение. Но что именно реализовывать и какие проекты брать ? На самом деле довольно популярный вопрос и единого мнения на этот счет нет. Одни говорят &#8212; &#171;Только не создавайте очередную социальную сеть/движок блога или приложение ToDo&#187; или &#171;Создайте какое-то приложение которое нужно именно вам в данный момент времени.&#187; Другие им отвечают &#8212; &#171;А какая разница что делать ? Если создавая очередной facebook вы прокачаете нужные вам скиллы, то это именно то что вам и нужно делать !&#187;.</p>
<h4>Что и до какого состояния доводить.</h4>
<p>Самое главное, ваше приложение должно иметь какой-то законченный вид, это очень важно. Приложение должно решать какую-то пусть небольшую проблему и что-то уметь делать. На этом этапе не стоит особо переживать за качество кода. В конце концов, это ведь ваше начало пути как разработчика. Второе, начав реализовывать свой &#171;facebook&#187; не пытайтесь объять необъятное. Если в начале всё кажется вполне простым, &#171;Ну что там, регистрация, авторизация, несколько полей в базе с личной информацией, аватарка&#187;. То впоследствии всегда начинают всплывать определенные нюансы и можно уйти в долгострой. Визуально вы может даже получите точную копию &#171;фейсбука&#187;, а на деле абсолютно нерабочее приложение. При этом затратите месяцы, не забывайте что в фейсбуке работает более 40 тысяч человек, а вы всего один. Делайте самую простую, самую малую часть, но чтобы всё работало и постепенно можно обрастать функционалом. Очень важно видеть свой прогресс.</p>
<h4>Pet-проекты</h4>
<p>Перелопатив множество сайтов, ютуб-каналов в российском и зарубежном сегменте интернета, собрал небольшой список возможных проектов. Если у вас есть какие-то идеи что можно реализовать, можете написать в комментариях, добавлю в общий список.</p>
<h5><strong>Приложения:</strong></h5>
<h6>Калькулятор.</h6>
<p>Здесь всё понятно. Наверно каждый делал свой калькулятор. Считаете что это слишком просто ? Попробуйте добавить сюда функции инженерного калькулятора. Добавьте логарифмы, факториал, перевод в системы счисления, округления. Попутно решите вопрос как и в каких типах хранить данные, как сделать проверку чтобы в запись дроби нельзя было ввести более 1 точки и прочее. Возможно наткнетесь на случаи когда сложив два числа с плавающей точкой результат вас неприятно удивит. В общем мелкие, не совсем очевидные сначала вещи.</p>
<h6>Текстовый редактор.</h6>
<p>Здесь вы можете взять за основу любой текстовый редактор, хотя бы стандартный блокнот. Что здесь именно делать ? Набор текста, сохранение, открытие, создание нового файла. Поиск по тексту. Поиск снизу, сверху, с учетом и без учета регистра. Особым шиком будет написать редактор где, например, будет подсвечиваться синтаксис. В общем возьмите любой текстовый редактор и подсмотрите какой функционал вы бы хотели реализовать у себя.</p>
<h6>Системы счисления.</h6>
<p>А также перевод между системами. На самом деле, это можно реализовать и внутри обычного калькулятора. Но и в качестве отдельного приложения вполне имеет право на жизнь. Особенно если помимо двоичной, восьмеричной и шестнадцатеричной системы счисления вы добавите ещё и троичную, которая в свою очередь может быть симметричной или несимметричной. А можете и вовсе добавить произвольный выбор системы счисления. Только не используйте готовые библиотеки для перевода между системами.</p>
<h6>Шифраторы с помощью различных алгоритмов.</h6>
<p>А вот это вообще довольно интересная вещь. Возможностей зашифровать сообщение довольно много, начиная от примитивного шифра Цезаря которая шифруемые символы сдвигаются по алфавиту на какое-то постоянное значение. И до вполне серьезных алгоритмов шифрования. Тема на самом деле довольно глубокая и копать в ней можно бесконечно далеко. Можно также реализовать свой примитивный мессенджер используя данные алгоритмы.</p>
<h6>Почтовый клиент.</h6>
<p>Попробуйте сделать свой почтовый клиент. Прием почты, отправка, небольшой редактор для написания текста письма. Особый шик &#8212; возможность форматировать текст и отправлять его со всем форматированием. Возможность добавлять вложения.</p>
<h6>Сканер портов.</h6>
<p>Довольно интересный проект. Сканировать все порты на компьютере, определять какие на них висят приложения, номер порта, статус.</p>
<h6>Каталогизатор.</h6>
<p>Тут на самом деле можно расшоркаться в любую сторону и на столько глубоко, на сколько будет желание. Что именно каталогизировать ? Да что угодно, можете взять музыку, фильмы. Сделать возможность скачивания обложек, получение данных по длине проигрывания файла. Год выпуска произведения, имя артиста или режиссера, акторов, получение рейтинга в случае если это фильм. Где всё это брать ? Например на IMDB, в случае с музыкой думаю тоже есть несколько вариантов. Далее можно создать функции поиска, сортировки, выборки нужных данных на основе каких-то запросов. Заодно прокачаете свои навыки в работе с базами данных.</p>
<h6>Банковское приложение.</h6>
<p>Думаю многие из вас знают как они выглядят. На мой взгляд, тут можно пойти двумя путями.</p>
<p>Вариант 1: пишем свое небольшое веб приложение, а-ля банк Bank of Petroff. Пробуем спроектировать под это дело базу данных, продумываем как и какие данные нужно хранить. Можно реализовать двухфакторную аутентификацию, разлог через 10-15 минут неактивности и прочее. Далее можно написать свое десктопное или мобильное приложение, которое будет подключаться к вашему веб-приложения через API или ещё каким образом и после аутентификации отображать определенную информацию.</p>
<p>Вариант 2: на сегодня довольна популярна тема с фондовым рынком и акциями. Вы можете написать приложение, веб, десктоп или мобильное. Суть которого заключается в том, что у пользователя создается виртуальный счет, но играет он по реальным котировкам. Это будет довольно таки серьезное приложение. Где брать данные о котировках ? Можно нагуглить несколько сервисов где данные о ценах можно получать через API. Любите крипту ? Сделайте тоже самое с учебным счетом но с криптой на API от coinmarketcap.</p>
<h6>Галерея изображений.</h6>
<p>Также может быть как desktop, так и мобильное приложение или веб-приложение. Можно сделать какой-нибудь сильно облегченный аналогв ACDSee или irfanview. Просмотр изображений, данные об изображении, изменение имени файла и удаление прямо из приложения. Можно сделать галерею под Android, если она при этом не будет тормозить, будет вообще замечательно.</p>
<h6>To-Do лист.</h6>
<p>Список каких-то дел или задач. Особо тут даже добавить нечего.</p>
<h6>Веб-браузер.</h6>
<p>Здесь есть несколько вариантов для реализации:</p>
<p>Во-первых, во многих IDE-шках есть свой готовый веб-браузер который одной командой в коде можно заставить перейти на какую-то страницу. Далее читаем документацию по этой библиотеке/классам и постепенно наращиваем какой-то функционал. Просмотр кода, поиск по странице, сохранение страницы, закладки, да много чего.</p>
<p>Второй вариант, вы можете взять за основу движок хрома или файрфокса и далее аналогично допиливать что-то свое. По скольку вы используете их готовый движок, самое сложное уже реализовано, это касается и первого варианта.</p>
<p>Третий вариант, можно попробовать сделать классический текстовый браузер, многие из вас их в глаза не видели, но всё начиналось именно с них. Просто парсите страницу, и выдаете информацию в каком-то упорядоченном виде, в каком, решать вам. Здесь вы сможете отлично попрактиковаться с веб-запросами. Намного лучше чем в первых двух вариантах.</p>
<p>Четвертый вариант, реализовывать всё самому, на самом деле это утопия. Опять же, в качестве учебного проекта вам это надоест уже на этапе парсинга HTML кода. Я даже не говорю по CSS/JS и мультимедиа и про то что это ещё надо как-то выводить, причем корректно. Как пишут при выполнении опасных трюков, &#171;Не пытайтесь повторить это дома&#187;. Даже Microsoft годами безуспешно мучился с IE, про который говорили что он нужен только для скачивания другого браузера. А вот первые три варианта вам вполне по силам.</p>
<h6>Файловый проводник.</h6>
<p>Аналог стандартного проводника Windows или что-то в стиле классического Far manager. С полным набором функций для работы с папками и файлами. Создание, удаление, переименование, копирование. Примерный функционал и меню можете подглядеть у любого файлового менеджера. Впоследствии, на базе этого проекта можно сделать ещё и архиватор.</p>
<h6>Архиватор</h6>
<p>Архиватор можно попробовать сделать уже на базе своего файлового менеджера. Так получится вдвойне интересно и у вас уже будет готовый интерфейс. Для начала хватит двух базовых функций, запаковка и распаковка в zip формат. Либо объединить несколько файлов в один архив вообще без сжатия. При желании сделать что-то более крутое появляется огромное поле для маневра. Вы можете добавить возможность запаролить архив, зашифровать имена файлов, разбить архив на тома. Можете изучить различные алгоритмы сжатия данных, а их не так уж и мало и добавить поддержку других форматов. Можете реализовать возможность самораспаковывающихся архивов. Ну и прямо самая вишенка на торте, возможно вы придумаете какой-то свой алгоритм сжатия данных. Пусть он будет самый медленный и не оптимальный, вообще не имеет значения.</p>
<h6>Клавиатурный тренажер.</h6>
<p>Идея приложения заключается в том, чтобы научить человека быстрому набору/вводу данных с клавиатуры. Человек нажимает какую-то клавишу, вы это перехватываете и как-то обрабатываете. Или наоборот, вы поочередно отображаете какие-то символы, а пользователь должен их вводить. Постепенно повышаете сложность добавляете другие буквы/цифры. В нулевых годах в этой области была популярна программа &#171;Соло на клавиатуре&#187;, благодаря которой я довольно быстро освоил 10 пальцевый набор текста. А через некоторое время и вовсе начал печатать не глядя на клавиатуру. Кто знает, может и ваше приложение кому-то очень сильно поможет. Как минимум можете протестировать его на своих близких, кто печатает одним пальцем пристально рассматривая клавиатуру.</p>
<h6>Календарь.</h6>
<p>Здесь тоже на первый взгляд всё понятно и особых сложностей нет. Но помимо календаря, на его базе можно сделать записную книжку с уведомлениями куда угодно. Через месяц у вас намечено что-то не особо нужное, но проигнорировать это будет не вежливо ? Добавьте уведомление о нём за пару дней до события с отправкой по разным каналам.</p>
<h6>Учет калорий и физической активности.</h6>
<p>Простенькое фитнес приложение. Заносите данные по различным видам физической активности, калорийности продуктов. Пользователь вводит данные, например, творог 200 грамм 9% жирности. А программа сразу подставляет данные сколько это калорий. Можно сделать индикатор на сколько этот продукт полезен. Можно сделать уведомление сколько человек ещё можно съесть сегодня. Само собой человек при регистрации должен как минимум указать свой вес и цель. Можно выдавать в конце дня или на следующее утро отчет.</p>
<p>Например, &#171;За вчерашний день у вас недобор {x} грамм белка&#187;.  Или &#171;За последние {x} суток вы не потребляли сложные углеводы&#187;. Также дать возможность пользователю вводить активности и сколько калорий он за это время сжег. Можете даже сделать какую-то красивую инфографику или анимацию. Что-то в духе сегодня вы потратили на 90 калорий больше чем потребили и потеряли 10 грамм жира. Вроде смешно, но в плане психологии всегда приятно видеть положительную динамику. А если удастся через API получать данные с фитнес-браслетов, то приложение и вовсе может перейти в разряд коммерческих.</p>
<h6>Мессенджер.</h6>
<p>На рубеже середины/начала нулевых была огромная масса различных мессенджеров, существенная часть которых крутилась вокруг icq который тогда ещё принадлежал компании AOL. Вы можете сделать простенький мессенджер для обмена сообщениями между двумя приложениями. В плане практики вещь довольно интересная, можно натаскаться в плане работы с сокетами, асинхронными методами, исключениями, запросами. Как реализовывать ? Можно упростить и задавать IP адрес собеседника напрямую. Можно сделать веб-сервис который будет транзитом в передаче сообщений. А можно сделать чтобы при входе в сеть вашего мессенджера вы получали адреса всех своих контактов и далее вели переписку напрямую. По сути используя сервер только для регистрации (вот кстати ещё одна вещь которую можно реализовать) и/или получения IP-адресов по их номером/псевдонимам в сети. Далее можете усложнить проект и добавив какой-то вид шифрования, начиная от шифра Цезаря и вплоть до самых стойких современных алгоритмов.</p>
<h6>Эквалайзер.</h6>
<p>Визуализация звукового сигнала. Проект не на столько легкий как может показаться, однако тема раньше была очень популярна и информации должно быть много.</p>
<h6>Агрегатор курсов криптовалют.</h6>
<p>По сути, это тренировка работы с API. Ключ, а вместе с ним и все данные можно получить на CoinMarketCap.Что с этим делать ? Можете завести базу данных, с определенной переодичностью делать запросы, вести какую-то статистику. Возможно даже какое-то прогнозирование. А уж в плане инфографики и отчетов тут поле непаханное, а заодно  и с базами данных попрактикуетесь.</p>
<h6>Сервис сокращения ссылок.</h6>
<p>Довольно простой проект даже для новичка. Итак, на вход к нам приходит ссылка любой допустимой для веб-адреса длины. Мы независимо от её длины всегда выдаем что-то типо https://site.rr/dHr81Ja или https://site.rr/link.php?id=dHr81Ja. Второй случай на том же php новичку реализовать на порядок проще. Как пример, приходит ссылка, мы её хешируем, оставляем от хеша первые 7 символов, остальное вырезаем и выкидываем. Записываем в базу данных исходную ссылку и 7 символьный хеш. Далее вместо длинной ссылки выдаем пользователю ссылку вида https://site.rr/link.php?id=dHr81Ja. При клике по ней отрабатывает скрипт link.php который лезет в базу данных и забирает полную ссылку для записи у которой краткая ссылка равна dHr81Ja. Вот собственно и вся реализация. Делать можно на любом языке и в идеале выдавать в таком виде https://site.rr/dHr81Ja. В качестве усложнения задания, можно считать количество переходов или сохранять дату последнего перехода. Может ещё что-то придумаете.</p>
<h6>Генератор QR кодов.</h6>
<p>Опять же довольно простой проект. С чаем и печенками отвлекаясь на поглажку кота можно сделать за несколько часов. Есть готовые библиотеки которые генерируют QR / Bar коды при передаче строкой данных которые собственно и нужно закодировать. Чтобы хоть немного усложнить задачку, можно задать уровень коррекции ошибок. Опять же, всё это реализовано в готовых классах, нужно лишь реализовать передачу различных аргументов в зависимости от выбора пользователя. Всего есть 4 уровня коррекции. Можно также задать опцию выбора размера кода, можно добавить ненавистную дизайнерам фразу &#171;поиграться с цветами&#187;. Можно добавить возможность пакетного создания Bar/Qr кодов, например считывая построчно текстовый файл. И сохранять готовые файлы в какую-то папку.</p>
<h6>Аудио/Видео плеер.</h6>
<p>Приложение такого плана можно реализовать где угодно, на любой платформе. Самое популярное, безусловно это в веб. На базовом уровне достаточно стандартных элементов проигрывания. Плей, пауза, стоп, вперед, назад и возможности загрузить какой-то список, например все аудиофайлы из папки. Или сделать возможность добавления файлов в плейлист. Главное чтобы условный аудиофайл в плейлисте был не один, это повысит уровень сложности самой программы. Вам нужно будет сопоставлять названия музыкальных композиций в соответствие с их адресами на сайте или компьютере. Также можно добавить функцию шаффл, когда плейлист перетряхивается в рандомном порядке. И добавить возможность создания, сохранения и загрузки плейлистов.</p>
<h6>Антикапча.</h6>
<p>Добро пожаловать в мир нейронных сетей. Капчу наверное ненавидят все, но в борьбе со спамом ничего принципиально нового не могут придуть годами. Вы можете попробовать написать простую нейронную сеть которая будет разгадывать какие-то определенные виды капчи. Вы можете написать свой вариант геренации капчи, это довольно простая задача если особо не заморачиваться с фильтрами и прочим. Ну и затем на своей капче можете натренировать нейронную сеть на её разгадывание. Можно также выводить веротяности уверенности в верном распознавании символов.</p>
<h6>Определение модели компьютера и возможность апгрейда.</h6>
<p>Можно по примеру open source программы Open Hardware Monitor или Aida собирать информацию о компьютере/комплектующих и выдавать общую информацию о системе. Далее на основе эти данных можно получать информацию из открытых источников о возможности апгрейда компьютера. Например, программа определяет что в компьютере установлен двухъядерный процессор Core2Duo E8200 на 775 сокете. При этом материнская плата базируется на чипсете G41 который поддерживает 4-х ядерные процессоры вплоть до Q9550. Или в системе установлено 4 Гб оперативной памяти, но в материнской плате есть ещё 2 свободных слота поддерживающих по 2 Гб памяти.</p>
<p>Где брать эту информацию ? Парсить сайты nix.ru, cpu-upgrade.com и другие. Само собой ручаться за эту информацию нельзя, о чем было бы неплохо указать в самой программе. В целом проект был бы интересен множеству людей желающий провести апгрейд, но не имеющих элементарных знаний. Программа позволила бы дать им хотя бы первичную оценочную информацию об этой возможности и даже указать примерную стоимость комплектующих. Добавьте сюда монетизацию ссылок на подходящие комплектующие и вот вам коммерческий продукт.</p>
<h6>Личные доходы/расходы.</h6>
<p>Как следует из названия, программа позволит вести учет доходов  и расходов. Можно выводить какие-то отчеты по расходам, средний расход за год, наибольшие траты по секторам и/или каким-то отдельным вещам. Например &#8212; &#171;За этот год вы потратили 5% вашего бюджета на сигареты&#187;. Собственно, обычная простенькая бухгалтерия для личного пользования. Для облегчения ведения можно помогать пользователю вводить названия покупок, предлагая по первым введенным буквам ранее использованные варианты. Также автоматическое подстановка стоимости, если человек весь год покупает пакет за 5 рублей, зачем ему целый год вводить в поле 5 рублей. Пусть вводится на автомате, если пакет подорожает, пользователь сам впишет туда новую цену.</p>
<h6>Калькулятор финансовой независимости.</h6>
<p>А вот это уже довольно интересный проект. Как много вы можете придумать вариантов получения пассивного дохода ? На сколько его можно прогнозировать ? Допустим, человек в возрасте 25 лет решает что к 45 годам он хочет выйти на пассивный доход 30 тысяч рублей. Для этого надо во что-то инвестировать, что-то сдавать, что-то развивать, получать деньги с условной рекламы в ютуб. Какие-то показатели считаются элементарно, какие-то можно брать лишь оценочно на основе средних значений. Пример, человек регистрируется, указывает что никаких доходов кроме зарплаты у него нет. Но он каждый месяц покупает акции и облигации. Здесь данные вполне точные, мы знаем сумму получаемого купона по облигациям с горизонтам до десятка лет. Мы примерно знаем сумму по дивидендам на акции. Пусть она и задается в процентах, но зачастую это фиксированная сумма.</p>
<p>Так вот, допустим человек каждый квартал покупает по 2 акции AT&amp;T и по 2 акции Coca Cola. Первые раз в квартал платят 52 цента на акцию, вторые 42 цента на акцию. Итого ежеквартальных доход 1.88$ (налоги пока не считаем) или 45 рублей в месяц. Но в следующем квартале человек купит ещё по 2 акции и на следующий квартал его пассивный доход составит уже 3.76$ или 1.25$ в месяц или ~90 рублей. Так вот, программа может рассчитывать через какое время наш пассивный доход может достичь нужной нам цифры. Сюда же можно добавить реинвестирования прибыли в покупку новых акций. Помимо акций могут быть другие источники дохода, грубо говоря человек может добавить источник &#8212; сдача квартиры + 10к руб в месяц. В общем много расписывать не буду, думаю суть вы уловили.</p>
</div>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82/"> 50+ идей Pet-проектов для программиста часть 1</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogee.ru/50-%d0%b8%d0%b4%d0%b5%d0%b9-pet-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d0%b4%d0%bb%d1%8f-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b0-%d1%87%d0%b0%d1%81%d1%82/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Быстрая сортировка</title>
		<link>https://blogee.ru/%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0/</link>
					<comments>https://blogee.ru/%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0/#respond</comments>
		
		<dc:creator><![CDATA[Artem]]></dc:creator>
		<pubDate>Tue, 23 Nov 2021 20:06:56 +0000</pubDate>
				<category><![CDATA[Алгоритмы]]></category>
		<guid isPermaLink="false">https://blogee.ru/?p=86</guid>

					<description><![CDATA[<p>Сегодня мы разберем пожалуй самый популярный алгоритм сортировки. Алгоритм получил свое название благодаря тому, что в большинстве случаев это действительно наиболее быстрый способ сортировки данных. Алгоритм изначально встроен в виде функции/метода во множество языков программирования. Возникает логичный вопрос, если быстрая сортировка на столько хорошо, зачем нужны остальные ? На самом деле здесь не все так ...</p>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0/">Быстрая сортировка</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="entry">
<p><img loading="lazy" class="alignnone size-large wp-image-87" src="https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art1-1024x576.jpg" alt="быстрая сортировка" width="1024" height="576" srcset="https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art1-1024x576.jpg 1024w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art1-300x169.jpg 300w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art1-768x432.jpg 768w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art1-1536x864.jpg 1536w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art1-2048x1152.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>Сегодня мы разберем пожалуй самый популярный алгоритм сортировки. Алгоритм получил свое название благодаря тому, что в большинстве случаев это действительно наиболее быстрый способ сортировки данных. Алгоритм изначально встроен в виде функции/метода во множество языков программирования. Возникает логичный вопрос, если быстрая сортировка на столько хорошо, зачем нужны остальные ? На самом деле здесь не все так просто как может показаться на первый взгляд. Давайте разбираться.</p>
<p><span id="more-86"></span></p>
<p>Не будем лить воду и давайте сразу перейдем к массиву данных на котором мы будем разбирать алгоритм:</p>
<p><strong>4 6 9 7 8 3 1 5 2</strong></p>
<p>Алгоритм быстрой сортировки базируется на двух ключевых вещах, во-первых, рекурсия. Кто вдруг не знает что такое рекурсия, это функция которая вызывает саму себя определенное количество раз. Во-вторых, на выборе опорного элемента и вот от выбора этого самого опорного элемента очень сильно зависит быстродействие алгоритма. В худших случаях алгоритм может работать не особо быстрее <a href="https://blogee.ru/%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC/" target="_blank" rel="noopener">пузырьковой сортировки</a>. Об этом мы поговорим дальше.</p>
<p>Так вот, у нас есть массив и нам нужно его отсортировать. На первом шаге нам нужно выбрать какой-то из элементов массива опорным. Какой ? В первых версиях алгоритма в качестве опорного выбирался самый первый элемент массива. Но если наш массив уже отсортирован, то вы как раз и получите наихудший по времени вариант работы алгоритма быстрой сортировки. Более оптимальным вариантом считается выбор элемента из середины последовательности или вообще рандомный элемент. Идеальным вариантом является выбор медианного элемента, однако такой подход на практике не используется потому что это слишком трудоемкая задача которая съест всю выгоду от применения быстрой сортировки.</p>
<p>Мы знаем что наш массив не отсортирован, поэтому давайте пойдем по классическому варианту и выберем опорным элементом первый &#8212; цифру 4.</p>
<p>Теперь мы берем поочередно все элементы массива и сравниваем их с нашим опорным (четверкой), если элемент меньше, он уходит влево, если больше, уходит вправо.</p>
<p>Первый элемент(после того, который взят опорным) 6, он больше опорного элемента 4, кидаем его вправо. 9 больше и тоже вправо. 7 больше, вправо, 8 вправо, 3 и 1 меньше и уходят влево, 5 вправо, 2 влево. Получаем такую картину:</p>
<p><span style="color: #ff0000;"><strong><span style="color: #000000;">3 1 2</span> 4 <span style="color: #000000;">6 9 7 8 5</span></strong></span></p>
<p>Элемент (цифра) 4 в нашей последовательности встала на свое конечное место. Теперь мы имеем 2 последовательности справа и слева от опорного элемента. Далее необходимо взять каждую из частей и проделать точно такие же манипуляции. В программном коде на этом моменте функция будет рекурсивно вызывать саму себя. Но с кодом мы разберемся чуть позже, смотрим дальше. Наши последовательности:</p>
<p><strong>3 1 2 </strong>и<strong> 6 9 7 8 5<br />
</strong></p>
<p>Теперь в каждой из них снова выбираем свой опорный элемент. Как вы помните, в качестве опорного мы берем тот что стоит первым:</p>
<p><strong><span style="color: #ff0000;">3</span> 1 2 </strong>и<strong><span style="color: #ff0000;"> 6</span> 9 7 8 5</strong></p>
<p>И сравниваем каждую из последовательностей со своим опорным элементом. В первом случае оба элемента меньше опорного и становятся слева от него:</p>
<p><strong>1 2 <span style="color: #ff0000;">3 </span></strong></p>
<p>В последовательности <strong><span style="color: #ff0000;">6</span> 9 7 8 5 </strong><span style="color: #000000;">после сравнения с опорным получаем:</span></p>
<p><strong>9 7 8 <span style="color: #ff0000;">6</span> 5</strong></p>
<p>Мы только что закончили &#171;вторую разбивку&#187; нашей последовательности, надеюсь вы ещё не запутались, ниже я прикреплю всё единой схемой чтобы никто ничего не упустил. Давайте посмотрим что мы имеем сейчас. Опорные элементы с прошлой итерации опять же отсортировались далее в процессе не участвуют, сейчас мы имеем 4 подмассива данных:</p>
<p><strong>1 2</strong> и <strong>пустой</strong> и <strong>9 7 8</strong> и <strong>5</strong></p>
<p>Самое время сказать несколько слов про рекурсию. Её основная сложность или если хотите проблема, это не уйти в вечный цикл. Как было сказано выше, алгоритм быстрой сортировки основан на рекурсии, каждая разбивка это подмассива на более мелкие подмассивы это рекурсивный вызов функции. Но в какой-то момент нам нужно остановиться и завершить её. Так вот любая рекурсивная функция состоит из двух частей, первая часть называется базовым случаем, это условие когда нужно остановиться. В алгоритме быстрой сортировки базовый случай это когда подмассив состоит из 1 элемента или вообще их не имеет. Такие массивы не имеет смысла дальше сортировать и нужно просто возвращать данные. Вторая часть рекурсивной функции описывает рекурсивный случай, когда функция снова должна вызывать саму себя пока не доберется до базового случая. Давайте посмотрим на примере наших 4 подмассивов:</p>
<p><strong><span style="color: #ff0000;">1</span> 2 &#8212; </strong>выбираем опорным первый элемент и продолжаем сортировать, это рекурсивный случай</p>
<p><strong>пустой </strong>(справа от тройки ничего не было)<strong> &#8212; </strong>а тут нам попросту нечего сортировать, это базовый случай, закончили</p>
<p><strong><span style="color: #ff0000;">9</span> 7 8 &#8212; </strong>выбираем опорным первый элемент и продолжаем сортировать, это рекурсивный случай</p>
<p><strong>5 &#8212; </strong>один элемент сортировать не имеет смысла, это базовый случай, закончили</p>
<p>На очередной итерации рекурсивной функции, в которую попадают подмассивы не достигшие базового случая, мы получаем снова 4 подмассива:</p>
<p><strong>пустой</strong> (слева от единицы ничего не было) &#8212; базовый случай, закончили</p>
<p><strong>2 &#8212; </strong>базовый случай, закончили</p>
<p><strong>пустой </strong>(слева от десятки ничего не было) &#8212; базовый случай, закончили</p>
<p><strong><span style="color: #ff0000;">7</span> 8 &#8212; </strong>более одного элемента, это рекурсивный случай, выбираем первый элемент опорным и продолжаем</p>
<p>Три из четырех массивов на предыдущей итерации попали в базовый случай и завершились, последний подмассив снова рекурсивно вызывается на сортировку, теперь получаем следующее:</p>
<p><strong>пусто</strong> (слева от семерки ничего не было)</p>
<p><strong>8</strong></p>
<p>Оба этих случая базовые, а значит рекурсивные вызовы закончились. Теперь нам нужно собрать или склеить результаты всех вызовов функции быстрой сортировки. Собирается это всё по принципу левый подмассив + опорный элемент + правый подмассив.</p>
<p>Попробуем немного изобразить что мы сделали в виде картинки.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-91" src="https://blogee.ru/wp-content/uploads/2021/11/quick-1.jpg" alt="быстрая сортировка" width="763" height="428" srcset="https://blogee.ru/wp-content/uploads/2021/11/quick-1.jpg 763w, https://blogee.ru/wp-content/uploads/2021/11/quick-1-300x168.jpg 300w" sizes="(max-width: 763px) 100vw, 763px" /></p>
<p>Каждый раз мы рекурсивно делили массив на 2 части относительно опорного элемента. Затем достигнув базового случая в каждом из подмассивов завершаем рекурсивный вызов.</p>
<h6>Сложность алгоритма</h6>
<p>В большинстве случаев алгоритм быстрой сортировки является наиболее быстрым вариантом сортировки массива данных. Однако не забывайте что очень многое зависит от выбора опорного элемента.</p>
<h6>Практическое применение:</h6>
<blockquote><p>Алгоритм быстрой сортировки имеет очень широкое применение и встроен в качестве функции/метода в большинство языков программирования.</p></blockquote>
</div>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0/">Быстрая сортировка</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogee.ru/%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Сортировка пузырьком</title>
		<link>https://blogee.ru/%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d1%83%d0%b7%d1%8b%d1%80%d1%8c%d0%ba%d0%be%d0%bc/</link>
					<comments>https://blogee.ru/%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d1%83%d0%b7%d1%8b%d1%80%d1%8c%d0%ba%d0%be%d0%bc/#comments</comments>
		
		<dc:creator><![CDATA[Artem]]></dc:creator>
		<pubDate>Sun, 21 Nov 2021 07:58:54 +0000</pubDate>
				<category><![CDATA[Алгоритмы]]></category>
		<guid isPermaLink="false">https://blogee.ru/?p=1</guid>

					<description><![CDATA[<p>Сортировка простыми обменами, она же пузырьковая сортировка, крайне популярный алгоритм используемый в процессе обучения студентов. Популярность алгоритма заключается в простоте объяснения и реализации данного алгоритма в программном коде. Начинаем разбираться. Допустим у нас есть массив целых чисел, возьмем к примеру вот такую последовательность: 4 8 1 9 2 6 И нам нужно её отсортировать с ...</p>
<p>Сообщение <a rel="nofollow" href="https://blogee.ru/%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d1%83%d0%b7%d1%8b%d1%80%d1%8c%d0%ba%d0%be%d0%bc/">Сортировка пузырьком</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="entry">


<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="576" class="wp-image-6" src="https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art-1024x576.jpg" alt="" srcset="https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art-1024x576.jpg 1024w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art-300x169.jpg 300w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art-768x432.jpg 768w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art-1536x864.jpg 1536w, https://blogee.ru/wp-content/uploads/2021/11/Dark-Blue-and-Turquoise-Gaming-YouTube-Channel-Art-2048x1152.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Сортировка простыми обменами, она же пузырьковая сортировка, крайне популярный алгоритм используемый в процессе обучения студентов. Популярность алгоритма заключается в простоте объяснения и реализации данного алгоритма в программном коде.</p>
<p><span id="more-1"></span> Начинаем разбираться. Допустим у нас есть массив целых чисел, возьмем к примеру вот такую последовательность:</p>
<p><strong>4 8 1 9 2 6</strong></p>
<p>И нам нужно её отсортировать с помощью алгоритма пузырьковой сортировки. Алгоритм заключается в том, что мы последовательно попарно сверяем по 2 соседних элемента массива и если элемент справа меньше чем элемент слева, то они меняются местами. Более легкий элемент будто всплывает, отсюда и название алгоритма. После первого прохода по всему массиву самый тяжелый элемент осядет в конце списка. Давайте рассмотрим это на нашем примере:</p>
<p><strong><span style="color: #ff6600;">4 8</span> 1 9 2 6</strong></p>
<p>Берем первые 2 элемента(выделены оранжевым цветом) и сверяем их, если первый элемент из пары больше чем второй элемент в паре, то они меняются местами. В нашем же случае первый элемент меньше второго, а значит в этой паре всё остается как есть. Теперь сравниваем следующую пару чисел.</p>
<p><strong>4 <span style="color: #ff6600;">8 1</span> 9 2 6</strong></p>
<p>Сравниваем по тому же принципу новую пару, 8 и 1. Первое число больше второго, а значит их нужно поменять местами. Напоминаю, более легкий элемент всплывает, более тяжелый тонет. Меняем местами и берем следующую пару чисел:</p>
<p><strong>4 1 <span style="color: #ff6600;">8 9</span> 2 6</strong></p>
<p>Как вы можете заметить, восьмерка опустилась ниже, единица всплыла. Берем следующую пару, это 8 и 9. Первое число меньше, значит оба остаются на своих позициях. Берем следующие:</p>
<p><strong>4 1 8<span style="color: #ff6600;"> 9 2</span> 6</strong></p>
<p>Первое число больше второго, меняем местами и берем следующую пару:</p>
<p><strong>4 1 8 2 <span style="color: #ff6600;">9 6</span></strong></p>
<p>И вот мы добрались до последней пары в нашем массиве. И снова первое число больше второго, значит меняем местами. По итогу полного прохода получаем вот такую картину:</p>
<p><strong>4 1 8 2 6 <span style="color: #ff0000;">9</span><br /></strong></p>
<p>Самый тяжелый элемент &#171;ушел на дно&#187;. Теперь нам нужно повторить все наши действия с самого начала, но не трогать последний элемент, мы его выделили красным цветом. На втором круге делается всё тоже самое, поэтому не буду расписывать. После всей цепочки перестановок на 2 круге получим следующую картину:</p>
<p><strong><span style="color: #ff9900;">4 1</span> 8 2 6 <span style="color: #ff0000;">9 <span style="color: #000000;">&#8212;</span> <span style="color: #000000;">1 <span style="color: #ff9900;">4 8</span> 2 6 <span style="color: #ff0000;">9 <span style="color: #000000;">&#8212;</span> <span style="color: #000000;">1 4 <span style="color: #ff9900;">8 2</span> 6</span> 9 <span style="color: #000000;">&#8212;</span> <span style="color: #000000;">1 4 2 <span style="color: #ff9900;">8 6</span></span> 9<span style="color: #000000;"> &#8212; 1 4 2 6 <span style="color: #ff0000;">8 9</span></span></span></span><br /></span></strong></p>
<p>Мы также сравнивали попарно и после второго круга у нас появился ещё один отсортированный элемент. Продолжаем все наши действия сначала и исключая уже отсортированные элементы до тех пор пока не отсортируется весь массив. Давайте реализуем всё это в программном коде:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-group="Codegroup identifier" data-enlighter-title="C#" data-enlighter-theme="godzilla">//Создадим наш массив для сортировки
int[] arrayToSort = { 1, 3, 9, 5, 2, 6, 0, 4 };
//Получаем длину нашего массива
int len = arrayToSort.Length;
//Переменная для временного хранения значения при перестановке
int tmp;
//Цикл отвечает за количество проходов по массиву
for (int i = 0; i &lt; len - 1; i++)
{
   //А в этом цикле мы перебираем элементы
   //условие j &lt; len-1-i отвечает за то, чтобы на очередной итерации мы не брали уже отсортированные элементы
   //которые ушли на "дно" массива
   for (int j = 0; j &lt; len-1-i; j++)
   {
       //Проверяем больше ли элемент в позиции j чем стоящий справа от него элемент в позиции j+1 
       if (arrayToSort[j] &gt; arrayToSort[j+1])
       {
       //Если больше, тогда первый элемент из пары кладем во временную переменную tmp
       tmp = arrayToSort[j];
       //И ставим на позицию первого элемента, тот что стоит за ним
       arrayToSort[j] = arrayToSort[j+1];
       //И теперь на позицию второго элемента из пары помещаем значение из временной переменной
       arrayToSort[j+1] = tmp;
       }
       //Если первый элемент в паре оказался меньше, ничего не делаем и берем следующую пару
   }
}
</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-title="Python" data-enlighter-group="Codegroup identifier" data-enlighter-theme="godzilla">#
Код на Python будет добавлен позже. 
#</pre>
<p>Алгоритм пузырьковой сортировки имеет несколько улучшений и модификаций. Одно из них это использование флага проверки произошел ли обмен во время обхода элементов последовательности. Зачем это нужно ?</p>
<p>Массив ведь может прийти откуда угодно и не исключено что он уже отсортирован. Зачем нам в таком случае бегать по нему кругами ? Добавляем переменную-флажок и установим ему значение false, который будет переходить в значение true если на очередном переборе элементов массива была хоть одна перестановка. Если ни одной перестановки не произошло, значит массив полностью отсортирован и внешний (первый) цикл будет прерван. Модифицированный код будет выглядеть так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="godzilla" data-enlighter-group="bubbleSortMode" data-enlighter-title="C#" data-enlighter-highlight="5,11,20,24">int[] arrayToSort = { 1, 3, 9, 5, 2, 6, 0, 4 };
int len = arrayToSort.Length;
int tmp;
//Устанавливаем переменную флага в false
bool flag = false;

for (int i = 0; i &lt; len - 1; i++)
{
//Перед началом внутреннего цикла нужно сбросить флаг в false
//иначе цикл завершится после первого обхода
   flag = false;
   for (int j = 0; j &lt; len-1-i; j++)
   {
       if (arrayToSort[j] &gt; arrayToSort[j+1])
       {
          tmp = arrayToSort[j];
          arrayToSort[j] = arrayToSort[j+1];
          arrayToSort[j+1] = tmp;
          //произошел обмен позициями, устанавливаем flag в true
          flag = true;
       }
   }
   //Проверяем флаг
   if (flag == false) break;
}</pre>
<p>Новые строки подсвечены.</p>
<h6>Сложность алгоритма</h6>
<p>Алгоритм пузырьковой сортировки имеет сложность O (N<sup>2</sup>). Это значит что если мы сортируем массив из 10 элементов, то сложность алгоритма составит 10 в квадрате = 100. Не забываем, что сложность алгоритма O-большое оценивает алгоритм по наихудшему случаю когда мы достигаем конечного результата.</p>
<h6>Практическое применение:</h6>
<blockquote>Алгоритм пузырьковой сортировки не имеет практического применения и практически не выходит за рамки учебной литературы.</blockquote>
<p>&nbsp;</p>
<p>Тем не менее, считается что алгоритм из-за его простоты вполне возможно использовать, но только на массивах малой длины или на простаивающих машинах. В остальных случаях применяются более совершенные алгоритмы сортировки, например &#8212; алгоритм быстрой сортировки, который на больших массивах данных значительно превосходит пузырьковую сортировку.</p>


</div><p>Сообщение <a rel="nofollow" href="https://blogee.ru/%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d1%83%d0%b7%d1%8b%d1%80%d1%8c%d0%ba%d0%be%d0%bc/">Сортировка пузырьком</a> появились сначала на <a rel="nofollow" href="https://blogee.ru">Blogee</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogee.ru/%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d1%83%d0%b7%d1%8b%d1%80%d1%8c%d0%ba%d0%be%d0%bc/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
