Сортировка подсчетом визуализатор на языке программирования Java
ВВЕДЕНИЕ
В наше время новые информационные технологии занимают очень важное место не только в специализированных, но и в повседневных сферах жизни. Компьютеры применяются в бизнесе, менеджменте, торговле, учебе и многих других сферах деятельности человека.
Компьютерные технологии очень удобны для выполнения разнообразных операций, но в разных сферах применения эти операции разные. Потому, каждая отдельная отрасль, которая использует специфические технические средства, нуждается в своих собственных программах, которые обеспечивают работу компьютеров.
Разработкой программного обеспечения занимается такая отрасль науки, как программирование. Она приобретает все большее и большее значение в последнее время, ведь с каждым днем компьютер становится все более необходимым, все более повседневным явлением нашей жизни. Ведь вычислительная техника прошлых лет уже почти полностью исчерпала себя и не удовлетворяет тем потребностям, которые появляются перед человечеством.
Таким образом, новые информационные технологии очень актуальны в наше время и нуждаются в большем внимании для последующей разработки и совершенствования. Рядом с этим, большое значение имеет также и программирование, которое является одним из фундаментальных разделов информатики и потому не может оставаться в стороне.
Программирование содержит целый ряд важных внутренних задач. Одной из наиболее важных задач для программирования является задача сортировки. Под сортировкой обычно понимают перестановки элементов любой последовательности в определенном порядке. Эта задача является одной из важнейших потому, что ее целью является облегчение последующей обработки определенных данных и, в первую очередь, задачи поиска. Одним из эффективных алгоритмов поиска является бинарный поиск. Он работает быстрее, чем, например, линейный поиск, но его возможно применять лишь при условии, что последовательность уже упорядочена, то есть отсортирована.
Вообще, известно, что в любой сфере деятельности, которая использует компьютер для записи, обработки и сохранения информации, все данные сохраняются в базах данных, которые также нуждаются в сортировке. Определенная упорядоченность для них очень важна, ведь пользователю намного легче работать с данными, которые имеют определенный порядок.
Задача сортировки в программировании не решена полностью. Ведь, хотя и существует большое количество алгоритмов сортировки, все же целью программирования является не только разработка алгоритмов сортировки элементов, но и разработка именно эффективных алгоритмов сортировки. Мы знаем, что одну и ту же задачу можно решить с помощью разных алгоритмов, и каждый раз изменение алгоритма приводит к новым, более или менее эффективным решениям задачи. Основными требованиями к эффективности алгоритмов сортировки является, прежде всего, эффективность по времени и экономное использование памяти. Согласно этим требованиям, простые алгоритмы сортировки (такие, как сортировка выбором и сортировки включением) не являются очень эффективными.
Целью курсовой работы является реализация простейших алгоритмов сортировки в виде апплетов на языке программирования Java.
1 ОБЗОР ТЕХНОЛОГИИ JAVA
- Основные особенности языка
Java ˗ объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems(в последующем приобретённой компанией Oracle).
Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры.
Достоинство подобного способа выполнения программ состоит в полной независимости байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы(например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание.
Часто к недостаткам концепции
виртуальной машины относят то, что
исполнение байт-кода виртуальной машиной
может снижать
а) применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы(JIT-технология) с возможностью сохранения версий класса в машинном коде;
б) широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках;
в) аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10-30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++.
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы .NET компанией Microsoft [1].
1.2 Классификация платформ Java
Внутри Java существуют несколько основных семейств технологий:
- Java SE ˗ Java Standard Edition, основное издание Java, содержит компиляторы, API, Java Runtime Environment; подходит для создания пользовательских приложений, в первую очередь — для настольных систем.
- Java EE ˗ Java Enterprise Edition, представляет собой набор спецификаций для создания программного обеспечения уровня предприятия.
- Java ME ˗ Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например в мобильных телефонах, КПК, встроенных системах;
- JavaFX ˗ технология, являющаяся следующим шагом в эволюции Java как Rich Client Platform; предназначена для создания графических интерфейсов корпоративных приложений и бизнеса.
- Java Card ˗ технология предоставляет безопасную среду для приложений, работающих на смарт-картах и других устройствах с очень ограниченным объемом памяти и возможностями обработки [1].
1.3 Java и Microsoft
Компанией Microsoft была разработана собственная реализация JVM (MSJVM), включавшаяся в состав различных операционных систем, начиная с Windows 98 (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJVM в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).
MSJVM имела cущественные отличия от Sun Java, во многом ломающие основополагающую концепцию переносимости программ между разными платформами:
отсутствие поддержки программн
ого интерфейса вызова удаленных методов (RMI);
отсутствие поддержки технологи
и JNI;
наличие нестандартных расширений, таких как средства интеграции Java и DCOM, работающих только на платформе Windows.
Тесная интеграция Java с DCOM и Win32 ломала многоплатформенную суть языка. Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более.
В 2005 году компанией Microsoft для платформы .NET был представлен Java-подобный язык J#, не соответствующий официальной спецификации языка Java и исключённый впоследствии из стандартного инструментария разработчика Microsoft Visual Studio, начиная с Visual Studio 2008 [1].
1.4 Java и Android
Язык Java активно используется
для создания мобильных приложений
под операционную систему Android. При
этом программы компилируются в
нестандартный байт-код, для использования
их виртуальной машиной Dalvik. Для
такой компиляции используется дополнительный
инструмент, а именно Software Development Kit,
который предназначен для x86-машины
под операционной системой Linux. Его
разработали представители
Разработку приложений можно вести в среде Eclipse, используя при этом плагин — Android Development Tools (ADT). Версия JDK при этом должна быть 5.0 или выше [1].
1.5 Применения платформы Java
Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: RuneScape, Amazon, eBay, Yandex (неоднозначная информация в отношении Java), LinkedIn, Yahoo!.
Следующие компании в основном фокусируются на Java (J2EE) технологиях: SAP, IBM, Oracle. В частности, СУБД Oracle включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, хранимые процедуры [1].
1.6 Производительность
Программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке Си. Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997—1998 годах так называемого JIT-компилятора в версии 1.1 в дополнение к другим особенностям языка для поддержки лучшего анализа кода (такие как внутренние классы, класс StringBuffer, упрощенные логические вычисления и т. д.). Кроме того была произведена оптимизация виртуальной машины Java — с 2000 года для этого используется виртуальная машина HotSpot. По состоянию на февраль 2012 года, код Java 7 приблизительно лишь в 1.8 раза медленнее кода, написанного на языке Cи.
Некоторые платформы предлагают аппаратную поддержку выполнения для Java[источник не указан 436 дней]. К примеру, микроконтроллеры выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение байткода Java через опцию Jazelle [1].
1.7 Основные возможности
- автоматическое управление памятью;
- расширенные возможности обработки исключительных ситуаций;
- богатый набор средств фильтрации ввода/вывода;
- набор стандартных коллекций: массив, список, стек и т. п.;
- наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI);
- наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
- встроенные в язык средства создания многопоточных приложений;
- унифицированный доступ к базам данных:
- на уровне отдельных SQL-запросов — на основе JDBC, SQLJ;
- на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе Java Data Objects (англ.) и Java Persistence API;
- поддержка обобщений(начиная с версии 1.5);
- параллельное выполнение программ [1].
1.8 Java-апплет
Аппле́т (англ. applet от appli
Java-апплет – прикладная программа, чаще всего написанная на языке программирования Java в форме байт-кода. Java-апплеты выполняются в веб-браузере с использованием виртуальной Java машины (JVM), или в Sun's AppletViewer, автономном инструменте для тестирования апплетов. Java-апплеты были внедрены в первой версии языка Java в 1995 году. Java-апплеты обычно пишутся на языке программирования Java, но могут быть написаны и на других языках, которые компилируются в байт‐код Java, таких, как Jython.
Апплеты используются для предоставления интерактивных возможностей веб-приложений, которые не могут быть предоставлены HTML. Так как байт-код Java платформо-независим, то Java-апплеты могут выполняться с помощью плагинов браузерами многих платформ, включая Microsoft Windows, UNIX, Apple Mac OS и GNU/Linux. Такие программы с открытым исходным кодом, как applet2app, могут быть использованы для преобразования апплета в самостоятельные программы на Java или исполняемые файлы Linux и Windows.
Преимущества использования Java-апплетов:
а) кроссплатформенность;
б) апплет может работать на «всех» установленных к этому времени версиях Java, а не только с последней версией; однако, если апплет требует последнюю версию JRE, то клиент будет вынужден ждать более длительной загрузки;
в) апплет поддерживается большинством браузеров;
г) он кэшируется в большинстве браузеров, а потому будет быстро загружаться при возвращении на веб-страницу, но апплет может сохраняться в кэше и создавать проблемы после выхода новых версий;
д) он может иметь полный доступ к машине, на которой выполняется, если пользователь согласен на это;
е) апплет может улучшить использование: после первого запуска апплета, когда JVM уже выполняется и быстро запускается, преимущественно у постоянных пользователей Java, однако JVM придется перезапускать каждый раз, когда запускается новый браузер;
ж) он может запуститься с сопоставимой(но обычно медленнее) скоростью на других компилируемых языках, таких как C++, но во много раз быстрее, чем JavaScript;
з) он может перенести работу с сервера к клиенту, делая Интернет-решение с большим числом пользователей / клиентов.
Java-апплет обладает
а) он требует установки Java-расширения(plug-in), которое не во всех браузерах доступно по умолчанию;
б) он не может запуститься до тех пор, пока не запустится виртуальная Java-машина, и это может занять значительное время при первом запуске;
в) создание и дизайн хорошего пользовательского интерфейса с использованием апплетов считается более сложной задачей, чем с помощью технологии, основанной на HTML;
г) некоторые организации допускают только программное обеспечение, установленное администраторами. В результате многие пользователи не могут видеть апплеты по умолчанию;
д) апплеты могут потребовать использования определенного JRE.
Еще одной альтернативой апплетов для клиента Java является Java Web Start, который запускается вне браузера. В дополнение к функциям, доступным в апплете, простой доступ к полям предоставляет программам Java Web Start доступ по чтению и/или записи определенных файлов, хранящихся у клиента, а также к буферу обмена клиента [1].
1.9 Сравнение сред разработки Java и .Net
.Net и J2EE имеют отличия в технических деталях. Мы рассмотрим два наиболее существенных отличия, а именно технологии реализации многоплатформенности и многоязыковой поддержки.
Многоплатформенность. Для разработчика важно то, что и .Net, и J2EE предоставляют средства для создания Web-служб. До сих пор J2EE могла гордиться своей поддержкой многоплатформенности, но, если верить Microsoft, более это не является прерогативой J2EE. Microsoft позиционирует .Net как платформу с двухступенчатой компиляцией, что позволяет создавать среду выполнения для любой платформы, подобно Java. Eric Rutter, старший вице-президент Microsoft запустил информацию о переносе .Net на FreeBSD. FreeBSD – это операционная система, производная от BSD (Berkeley Software Distribution) Unix. Он объявил, что Microsoft в самом деле занимается созданием среды выполнения для FreeBSD. Создание такой среды нарушило бы гегемонию Java в области платформенной независимости, однако не стоит пока полагаться на эту информацию. Создание CLR для наиболее популярных операционных систем может занять много лет. Более того, однажды, Microsoft уже делала подобные заявления в отношении переноса DCOM (Distributed Component Object Model) на другие платформы. Однако такой перенос так и не был осуществлен.
Таким образом, на сегодняшний день единственной средой разработки, поддерживающей многоплатформенность, является J2EE.
Многоязыковая поддержка. Единственной языковой основой J2EE является Java, что сильно отличается от .Net, где поддерживается более двух дюжин языков, включая Fortran, COBOL, C++ и Visual Basic. Можно, конечно, поспорить насчет того, что единственный язык является более элегантным решением, однако надо признать, что .Net предлагает более простое решение для организаций, которые хотят пользоваться знаниями, которые уже имеются у их разработчиков. Ведь для тех разработчиков, которые используют языки, отличные от Java, .Net дает возможность создавать Web-службы на привычном им языке с минимальными затратами на переобучение.
В то время как вокруг . Net и J2EE бушуют споры, мы должны четко понимать, что представляет собой каждая из платформ. Каждая из технологий позволяет создавать Web-службы, доступные потребителям, использующим самые разные технологии. Web-служба на платформе .Net может вызывать J2EE Web-службу и наоборот, поскольку все Web-службы удовлетворяют одинаковым стандартам. Более того, даже если выяснится, что одна из технологий имеет преимущество, то эффективно использовать это преимущество сможет только высоко квалифицированный программист. Инструменты и средства хороши настолько, насколько хорош программист, их использующий.
Если рассуждать с точки
зрения развития отрасли
Web-службы создают однородное представление для неоднородной среды. И если это верно, то Web-службы должны прекратить споры о том, какая из платформ является лучшей; разработчикам нет нужды беспокоиться о платформе, разрабатывая сервисы, поскольку Web-службы обеспечивают однородное представление.
Лучше всего попробовать разработать Web-службы и с помощью .Net, и с помощью J2EE. Тогда можно быстро понять, какая из платформ лучше. Выбирая поставщика, многие используют такое эмпирическое правило: если в настоящий момент вы используете платформу Microsoft, то выбирайте .Net, в противном случае – J2EE.
1.10 Преимущества языка программирования Java
Одно из главных преимуществ языка Java – его независимость от платформы, на которой выполняются программы. Таким образом, один и тот же код можно запускать под управлением операционных систем Windows, Linux, FreeBSD, Solaris, Apple Mac и др. Это становится очень важным, когда программы загружаются посредством глобальной сети интернет и используются на различных платформах.
Другим не менее важным преимуществом Java является большая схожесть с языком программирования C++. Поэтому тем программистам, которые знакомы с синтаксисом С и С++ будет просто освоить Java.
Кроме того, Java – полностью объектно-ориентированный язык, даже в большей степени, чем С++. Все сущности в языке Java являются объектами, за исключением немногих основных типов(primitive types), например чисел. В свое время объектно-ориентированное программирование(ООП) заменило структурное программирование.
Важно и то, что разрабатывать на Java программы, которые не содержат ошибок, значительно легче, чем на С++.
Все дело в том, что
Для этого было сделано следующее:
а) Разработчики исключили возможность явного выделения и освобождения памяти.
К примеру, память в Java освобождается автоматически с помощью механизма сбора мусора. Получается, что программист застрахован от ошибок, которые возникают от неправильного использования памяти.
б) Введение истинных массивов и запрещение указателей.
Теперь программисты не могут стереть данные из памяти по причине неправильного использования указателей.
г) Была исключена возможность перепутать оператор присваивания с оператором сравнения на равенство. Как правило, проблема со знаком "=" очень часто приводит в С и С++ к логическим ошибкам, которые не так просто обнаружить. Особенно в крупных программах.
д) Полностью исключено множественное наследование. Оно было заменено новым понятием – интерфейсом, идея которого была позаимствована из языка Objective C.
Интерфейс дает программисту
практически все, что тот
Выбранная среда программирования хороша тем, что Java одинаково хорошо функционирует и на Windows, и на юниксовидных системах.
- АЛГОРИТМИЧЕСКИЙ АНАЛИЗ
2.1 Постановка задачи
Разработать апплет на языке Java, который выполняет следующие действия:
а) формирует и выводит массив случайных чисел;
б) выводит сформированный массив;
в) отражает шаги сортировки;
г) выводит отсортированный массив.
2.2 Исходные данные к проекту
Исходными данными к проекту является массив, в котором 20 элементов, сформированных программой случайно на промежутке от 0 до 9.
2.3 Описание алгоритма сортировки подсчетом
Сортировка подсчетом - специализированный алгоритм, который очень хорошо работает, если элементы данных — целые числа, значения которых находятся в относительно узком диапазоне. Этот алгоритм работает достаточно быстро, например, если значения находятся между 1 и 1000.
Если список
удовлетворяет этим
Выдающаяся скорость
сортировки подсчетом
Идея вот в чем: для каждого элемента найти, сколько элементов, меньших определенного числа, и поместить это число на соответствующие место. Делается это так: за линейный проход по массиву мы для каждого из возможных значений подсчитываем, сколько элементов имеют такое значение. Потом добавляем к каждому из найденных чисел суму всех предыдущих. Получая, таким образом, сколько есть элементов, значения которых не больше данного значения. Далее, опять-таки за линейный проход, формируем из исходного массива новый отсортированный. При этом следим, чтобы два одинаковых элемента не были записаны в одно место.
2.4 Анализ алгоритма для его визуализации
Из рассмотрения алгоритма следует, что его визуализация должна выполняться следующим образом:
• показать массив A, заполненный начальными значениями;
• отразить ход решения
задачи – процесс заполнения
массива С, основанный на
• показать подсчет частичных сумм в массиве С;
• отразить процесс
3 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
3.1 Структура программного комплекса
Апплет состоит из 4 классов: CountSortApplet, CSCanvas, CSControls и AutoThread.
Таблица 3.1 – Содержимое класса CountSortApplet
Имя |
Вид элемента |
Тип |
Спецификатор |
Описание |
1 |
2 |
3 |
4 |
5 |
init |
Метод |
void |
public |
Инициализация апплета |
destroy |
Метод |
void |
public |
Удаление ссылок |
start |
Метод |
void |
public |
Запуск апплета |
stop |
Метод |
void |
public |
Остановка апплета |
processEvent(AWTEvent e) |
Метод |
void |
public |
События процессов на пункте меню |
getAppletInfo() |
Метод |
void |
public |
Возвращает текстовую информацию об аплете в виде объекта класса String. |
Таблица 3.2 – Содержимое класса CSCanvas
Имя |
Вид элемента |
Тип |
Спецификатор |
Описание |
1 |
2 |
3 |
4 |
5 |
N |
Поле |
int |
private static |
Размер массива, который нужно отсортировать |
K |
Поле |
int |
private static final |
Диапазон чисел |
i0 |
Поле |
int |
private static |
Переменная цикла. Счетчик |
i |
Поле |
int |
public static |
Переменная цикла. Счетчик |
j |
Поле |
int |
public static |
Переменная цикла. Счетчик |
m |
Поле |
int |
static |
Переменная цикла. Счетчик |
a[] |
Поле |
int[] |
static |
Входная последовательность |
b[] |
Поле |
int[] |
static |
Выходная отсортированная последовательность |
c[] |
Поле |
int[] |
static |
Вспомогательный массив |
astep |
Поле |
int |
static |
Переменная для сравнения |
bstep |
Поле |
int |
static |
Переменная для сравнения |
Продолжение таблицы 3.2
1 |
2 |
3 |
4 |
5 |
сstep |
Поле |
int |
static |
Переменная для сравнения |
state |
Поле |
int |
static |
Переменная для сравнения |
comment |
Поле |
string |
static |
Комментарии к каждому шагу выполнения |
comment2 |
Поле |
string |
static |
Комментарии к каждому шагу выполнения |
comment3 |
Поле |
string |
static |
Комментарии к каждому шагу выполнения |
init |
Метод |
void |
static |
Инициализация апплета |
restart |
Метод |
void |
static |
Перезапуск апплета |
randomStart |
Метод |
void |
static |
Заполнение входной |
paint |
Метод |
void |
static |
Рисует текст и граф. компоненты |
makeStep |
Метод |
void |
static |
Метод для пошагово выполнения |
Таблица 3.3 – Содержимое класса CSControls
Имя |
Вид элемента |
Тип |
Спецификатор |
Описание |
1 |
2 |
3 |
4 |
5 |
auto |
Поле |
boolean |
private |
Переменная для сравнения |
INITIAL_DELAY |
Поле |
int |
private static |
Задержка инициализации |
DELAYS |
Поле |
int |
private static |
Задержка выполнения шага при выполнении в автоматическом режиме |
CSControls(CSCanvas canvas) |
Метод |
void |
public |
Метод для отрисовки элементов управления |
Start |
Метод |
void |
public |
Запуск автоматического выполнения |
Stop |
Метод |
void |
public |
Остановка автоматического выполнения |
actionPerformed(ActionEvent ev) |
Метод |
void |
public |
Выполнение события на элементы управления |