Сортировка методом подсчета

Разработка программы, сортирующей массивы данных различного типа методом подсчета. Основные шаги алгоритма сортировки, ее свойства и модификация подсчетом. Целесообразность применения сортировки подсчетом. Условия эффективности алгоритма сортировки.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 16.07.2015
Размер файла 438,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное бюджетное государственное образовательное учреждение

Высшего профессионального образования

Кафедра автоматизированных систем управления

Отчет к лабораторной работе

Сортировка методом подсчета

Руководитель: Бакусова Наталья Сергеевна

Разработал: Давлетов Даниил Альбертович

Уфа, 2015

Содержание

  • Постановка задачи
  • Математическая модель
  • Текст программы
  • Руководство пользователя
  • Заключение
  • Список литературы

Постановка задачи

Целью работы является изучить методы сортировок. В результате работы должна быть написана программа, которая сортирует массив данных различного типа методом подсчета.

Математическая модель

Сортировка подсчётом - алгоритм сортировки, в котором используется диапазон чисел сортируемого массива (списка) для подсчёта совпадающих элементов.

Алгоритм сортировки состоит из следующих шагов:

1) Просмотр исходного массива и подсчет количества элементов в этом массиве (количество сохраняется во вспомогательном массиве);

2) Просмотр вспомогательного массива и запись элементов в отсортированном порядке.

Идея сортировки заключается в том, что необходимо посчитать количество элементов в исходном массиве и дальше записать их в отсортированном порядке посчитанное число раз.

Свойства сортировки:

1) Не является сортировкой сравнением: ни одна пара элементов не сравнивается друг с другом.

2) Требует дополнительную память под массив-счетчик.

Модификации сортировки подсчетом:

1) Если известно, что в исходном массиве минимальный элемент равен - Min, а максимальный - Max, то вспомогательного массив достаточно создавать размером - Max-Min+1.

2) С помощью сортировки подсчетом можно сортировать знаковые типы. Например, при сортировке - signed char, принимающего значения от - 128 до 127, индексу - 0 во вспомогательном массиве будет соответствовать значение - 128, индексу - 1 - 127, …, индексу 255 - 127.

Алгоритмическая модель

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Текст программы

#include <stdio. h>

#include <windows. h>

#include <stdlib. h>

#include <iostream>

using namespace std;

void Menu ();

void ForIntegerFromMinToMax ();

void ForIntegerFromMaxToMin ();

void ForSymbolsFromMinToMax ();

void ForSymbolsFromMaxToMin ();

void Exit ();

int main () {

SetConsoleCP (1251);

SetConsoleOutputCP (1251);

void (*f [6]) () = {Menu, ForIntegerFromMinToMax, ForIntegerFromMaxToMin, ForSymbolsFromMinToMax, ForSymbolsFromMaxToMin, Exit};

int choice; // переменная для выбора пункта меню

printf ("_____\nМеню. \n1: Текст задачи\n");

printf ("2: Сортировка подсчетом для целых чисел (от меньшего к большему) \n");

printf ("3: Сортировка подсчетом для целых чисел (от большего к меньшему) \n");

printf ("4: Сортировка подсчетом для букв (по алфавиту) \n");

printf ("5: Сортировка подсчетом для букв (в обратном порядке) \n");

printf ("6: Выход\n_____\n");

printf ("\nВведите число от 1 до 6 включительно, выбрав пункт меню: ");

for (;;) {

if (scanf ("%d", &choice) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите число от 1 до 6 включительно: ");

fflush (stdin);

}

else break;

}

for (;;) {

if (choice>0 && choice<7) {

(*f [choice-1]) ();

printf ("\nВведите число от 1 до 6 включительно, выбрав пункт меню: ");

}

else

printf ("\n\n\aТакого пункта меню не существует! \nВведите число от 1 до 6 включительно, выбрав пункт меню: ");

for (;;) {

if (scanf ("%d", &choice) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите число от 1 до 6 включительно: ");

fflush (stdin);

}

else break;

}

}

return 0;

}

void Menu () {

printf ("Написать программу сортировки методом подсчета различных типов данных. \n");

printf ("_____\nМеню. \n1: Текст задачи\n");

printf ("2: Сортировка подсчетом для целых чисел (от меньшего к большему) \n");

printf ("3: Сортировка подсчетом для целых чисел (от большего к меньшему) \n");

printf ("4: Сортировка подсчетом для букв (по алфавиту) \n");

printf ("5: Сортировка подсчетом для букв (в обратном порядке) \n");

printf ("6: Выход\n_____\n");

}

void ForIntegerFromMinToMax () {

int i, j, n, a, b;

int *A, *C;

int maxC, minC;

printf ("Введите размер массива: \t");

for (;;) {

if (scanf ("%d", &n) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите размер массива заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите левую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &a) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите левую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите правую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &b) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите правую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

A= (int *) malloc (n*sizeof (int));

printf ("Исходный массив: \t");

for (i=0; i<n; i++) {

A [i] =rand () % (b+1-a) +a;

printf ("%d\t", A [i]);

}

printf ("\n");

maxC=A [0];

minC=A [0];

for (i=1; i<n; i++) {

if (maxC<A [i])

maxC=A [i];

if (minC>A [i])

minC=A [i];

}

C= (int *) calloc (maxC-minC+1,sizeof (int));

for (i=0; i<n; i++) {

C [A [i] - minC] ++;

}

// Вывод от меньшего к большему

printf ("Результат: \t");

for (i=0; i<maxC-minC+1; i++) {

for (j=0; j<C [i]; j++) {

printf ("%d\t", i+minC);

}

}

printf ("\n\n");

free (C);

free (A);

}

void ForIntegerFromMaxToMin () {

int i, j, n, a, b;

int *A, *C;

int maxC, minC;

printf ("Введите размер массива: \t");

for (;;) {

if (scanf ("%d", &n) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите размер массива заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите левую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &a) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите левую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите правую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &b) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите правую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

A= (int *) malloc (n*sizeof (int));

printf ("Исходный массив: \t");

for (i=0; i<n; i++) {

A [i] =rand () % (b+1-a) +a;

printf ("%d\t", A [i]);

}

printf ("\n");

maxC=A [0];

minC=A [0];

for (i=1; i<n; i++) {

if (maxC<A [i])

maxC=A [i];

if (minC>A [i])

minC=A [i];

}

C= (int *) calloc (maxC-minC+1,sizeof (int));

for (i=0; i<n; i++) {

C [A [i] - minC] ++;

}

printf ("Результат: \t");

// Вывод в от большего к меньшему

for (i=maxC-minC; i>=0; i--) {

for (j=0; j<C [i]; j++) {

printf ("%d\t", i+minC);

}

}

printf ("\n\n");

free (C);

free (A);

}

void ForSymbolsFromMinToMax () {

int i, j, n, a, b;

int *C;

char *A;

int maxC, minC;

printf ("Введите размер массива: \t");

for (;;) {

if (scanf ("%d", &n) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите размер массива заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите левую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &a) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите левую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите правую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &b) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите правую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

A= (char *) malloc (n*sizeof (char));

printf ("Исходный массив: \t");

for (i=0; i<n; i++) {

A [i] =rand () % (char (b) +1-char (a)) +char (a);

cout << A [i] << "\t";

}

printf ("\n");

maxC= (int) A [0];

minC= (int) A [0];

for (i=1; i<n; i++) {

if (maxC<A [i])

maxC=A [i];

if (minC>A [i])

minC=A [i];

}

C= (int *) calloc (maxC-minC+1,sizeof (int));

for (i=0; i<n; i++) {

C [ (int) A [i] - minC] ++;

}

printf ("Результат: \t");

// Вывод от меньшего к большему

for (i=0; i<maxC-minC+1; i++) {

for (j=0; j<C [i]; j++) {

cout << char (i+minC) << "\t";

}

}

printf ("\n\n");

free (C);

free (A);

}

void ForSymbolsFromMaxToMin () {

int i, j, n, a, b;

int *C;

char *A;

int maxC, minC;

printf ("Введите размер массива: \t");

for (;;) {

if (scanf ("%d", &n) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите размер массива заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите левую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &a) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите левую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

printf ("Введите правую границу диапазона сортировки: \t");

for (;;) {

if (scanf ("%d", &b) ==0) {

printf ("\n\n\aОшибка! Неправильный тип данных. \nПожалуйста, введите правую границу диапазона сортировки заново: ");

fflush (stdin);

}

else break;

}

A= (char *) malloc (n*sizeof (char));

printf ("Исходный массив: \t");

for (i=0; i<n; i++) {

A [i] =rand () % (char (b) +1-char (a)) +char (a);

cout << A [i] << "\t";

}

printf ("\n");

maxC= (int) A [0];

minC= (int) A [0];

for (i=1; i<n; i++) {

if (maxC<A [i])

maxC=A [i];

if (minC>A [i])

minC=A [i];

}

C= (int *) calloc (maxC-minC+1,sizeof (int));

for (i=0; i<n; i++) {

C [ (int) A [i] - minC] ++;

}

printf ("Результат: \t");

// Вывод в от большего к меньшему

for (i=maxC-minC; i>=0; i--) {

for (j=0; j<C [i]; j++) {

cout << char (i+minC) << "\t";

}

}

printf ("\n\n");

free (C);

free (A);

}

void Exit () {

printf ("\n\nВы ввели 6 для завершения работы. \n");

exit (0);

}

Руководство пользователя

1) Запустите приложение "SORTCPP”.

2) Выберите нужный пункт меню.

Рисунок 1 - экранная форма

3) Далее следуя подсказкам вводите данные.

Рисунок 2 - экранная форма

4) После того, как будет введено количество элементов и границы сортируемого диапазона, на экран выведется исходный массив (он заполняется случайным образом).

Рисунок 3 - экранная форма

5) После этого программа проделает вычисления и выведет отсортированный массив.

Рисунок 4 - экранная форма

6) После этого программа предложит выбрать пункт меню еще раз.

Заключение

В ходе работы был изучен метод сортировки подсчетом, которая имеет свои особенности.

Во-первых, применение сортировки подсчётом целесообразно лишь тогда, когда сортируемые числа имеют диапазон возможных значений, который достаточно мал по сравнению с сортируемым множеством. Эффективность алгоритма падает, если при попадании нескольких различных элементов в одну ячейку, их надо дополнительно сортировать.

Во-вторых, сортировка подсчетом не годится для вещественного типа исходных данных, так как размер дополнительного массива-счетчика равен максимальному элементу исходного массива, а это может быть только натуральное число.

сортировка подсчет алгоритм массив

Список литературы

1) Кнут Д.Э. Искусство программирования. - Вильямс, 2001. - 800 с.

2) Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. 2-е издание. - М.: Вильямс, 2010. - 1296 с.

3) Гасфилд Д. Строки, деревья и последовательности в алгоритмах. - БХВ - Петербург, 2003. - 654 с.

Размещено на Allbest.ru


Подобные документы

  • Анализ основных алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Сортировка пузырьком, методами вставок, выбора, методом Шелла, быстрая сортировка. Операция разделения массива внутренней сортировки.

    курсовая работа [161,7 K], добавлен 17.12.2015

  • Сортировка как процесс расстановки элементов "в некотором порядке", ее структура и основные компоненты, характеристика методов. Порядок выбора того или иного метода сортировки: линейный с обменом и подсчетом, методом Шелла, с отложенными обменами.

    реферат [27,1 K], добавлен 13.09.2009

  • Понятие алгоритма и сортировки. Способы и алгоритмы сортировки массивов. Быстрая сортировка Хоара. Описание алгоритма "быстрой сортировки". Реализация на языке программирования. Анализ наихудшего разбиения. Вероятностные алгоритмы быстрой сортировки.

    курсовая работа [291,5 K], добавлен 22.03.2012

  • Обработка массивов элементов любого типа как главное назначение алгоритмов сортировки. Анализ наиболее используемых алгоритмов сортировки: пузырьком, выбором, вставками, методом Шелла и быстрой сортировкой. Основные требования к алгоритмам сортировки.

    реферат [189,8 K], добавлен 06.12.2014

  • Разработка программы для осуществления сортировки данных методами "Выбора" с использованием языка C# и Visual Studio 2012. Плавный метод сортировки. Основные фазы сортировки во внутреннем представлении пирамиды. Программа сортировки методами выбора.

    курсовая работа [637,6 K], добавлен 29.11.2014

  • Изучение алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Отличительные черты сортировки включением, выбором, разделением, сортировки Шелла, обменной сортировки. Сравнение методов: плюсы и минусы.

    курсовая работа [203,8 K], добавлен 03.12.2010

  • Сущность и порядок реализации простых методов сортировки при составлении программного алгоритма, их классификация и разновидности, отличительные признаки, характерные свойства. Особенности алгоритмов для сортировки файлов записей, содержащих ключи.

    реферат [20,7 K], добавлен 20.05.2010

  • Составление алгоритма сортировки линейной вставкой. Понятие однонаправленного циклического списка символов, реализация процедуры подсчета суммы элементов и составление алгоритма. Прямое представление дерева, алгоритм работы с ним на абстрактном уровне.

    контрольная работа [32,8 K], добавлен 20.01.2012

  • Исследование основных особенностей алгоритмов быстрой и поразрядной сортировки данных. Построение графиков зависимости времени сортировки от количества элементов в файле и от степени перемешенности элементов. Описания сортировки чисел и строковых данных.

    лабораторная работа [1,2 M], добавлен 23.07.2012

  • Составление программы сортировки по возрастанию массив из 20 шестнадцатеричных чисел, просматривающей все исходные числа во внешней памяти и выбирающей самое большое число. Блок-схема алгоритма работы программы. Таблица команд и число их выполнения.

    курсовая работа [23,1 K], добавлен 24.05.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.