Научная статья на тему 'Оптимизация алгоритмов сортировки при решении задач с массивами'

Оптимизация алгоритмов сортировки при решении задач с массивами Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
1098
151
Читать
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПРОГРАММИРОВАНИЕ / ЯЗЫКИ ПРОГРАММИРОВАНИЯ / МАССИВЫ ДАННЫХ / АЛГОРИТМЫ СОРТИРОВКИ ДАННЫХ / ТЕСТИРОВАНИЕ ЗАДАЧ / АНАЛИЗ РЕЗУЛЬТАТОВ ТЕСТИРОВАНИЯ ЗАДАЧ / ОПТИМИЗАЦИЯ / ПРОЦЕССОР / ЭФФЕКТИВНОСТЬ МЕТОДА / PROGRAMMING / PROGRAMMING LANGUAGES / DATA STRUCTURES / SORTING ALGORITHMS / DATA / TESTING TASKS / THE RESULTS OF TEST PROBLEMS / OPTIMIZATION / PROCESSOR / THE EFFICIENCY OF THE METHOD

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Павлова Валерия Игоревна

В статье ставится задача определить максимально эффективный алгоритм сортировки для решения задач с массивами на языке программирования Си++. Проанализированы существующие алгоритмы сортировки, определены наиболее подходящие и на основе проведенного анализа результатов тестирования задач выявлен среди них максимально удовлетворяющий требованиям.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
Предварительный просмотр
i Надоели баннеры? Вы всегда можете отключить рекламу.

OPTIMIZATION OF ALGORITHMS OF SORTING AT THE SOLUTION OF TASKS WITH MASSIFS

The article seeks to identify the most efficient sorting algorithm for solving problems with arrays in the programming language C++. Analyzed existing sorting algorithms the most appropriate and on the basis of the conducted analysis of test results of the tasks identified among them best meets the requirements

Текст научной работы на тему «Оптимизация алгоритмов сортировки при решении задач с массивами»

УДК: 004.896 ББК: 32.973.2

Павлова В.И.

ОПТИМИЗАЦИЯ АЛГОРИТМОВ СОРТИРОВКИ ПРИ РЕШЕНИИ ЗАДАЧ

С МАССИВАМИ

Pavlova V.I.

OPTIMIZATION OF ALGORITHMS OF SORTING AT THE SOLUTION OF TASKS WITH MASSIFS

Ключевые слова: программирование, языки программирования, массивы данных, алгоритмы сортировки данных, тестирование задач, анализ результатов тестирования задач, оптимизация, процессор, эффективность метода.

Keywords: programming, programming languages, data structures, sorting algorithms, data, testing tasks, the results of test problems, optimization, processor, the efficiency of the method.

Аннотация: в статье ставится задача определить максимально эффективный алгоритм сортировки для решения задач с массивами на языке программирования Си++. Проанализированы существующие алгоритмы сортировки, определены наиболее подходящие и на основе проведенного анализа результатов тестирования задач выявлен среди них максимально удовлетворяющий требованиям.

Abstract: the article seeks to identify the most efficient sorting algorithm for solving problems with arrays in the programming language C++. Analyzed existing sorting algorithms the most appropriate and on the basis of the conducted analysis of test results of the tasks identified among them best meets the requirements

На сегодняшний день существует много языков программирования, с которых может быть начат процесс обучения студентов программированию, к ним можно отнести: Pascal, Python, C#, Java. Чем проще язык, тем он лучше, так как у студентов необходимо сформировать культуру алгоритмического мышления и понимания базовых конструкций. Но данное утверждение справедливо для студентов непрофильных специальностей

(юридические, экономические,

гуманитарные), так как для них языки программирования являются лишь небольшой частью образовательного процесса. Что же касается выбора первого языка программирования для студентов профильных специальностей (например, «Вычислительные машины, комплексы, системы и сети»), то его выбор играет ключевую роль в дальнейшем обучении. На первом курсе закладывается базис для дальнейшего обучения и формируется подход студента к дальнейшему получению знаний. И язык программирования играет в

этом не последнюю роль. Для того чтобы в качестве первого языка программирования был выбран С++, существует ряд причин: язык С++ является статически типизированным, компилируемым,

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

Помимо выбора языка

программирования, для качественного формирования алгоритмического

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

алгоритмов сортировки данных. К самым распространенным и наиболее часто используемым относят: алгоритм сортировки «пузырьком», алгоритм быстрой сортировки, сортировка методом Шелла, сортировка вставками.

Целью данной работы является анализ двух алгоритмов сортировки (алгоритм сортировки «пузырьком» и алгоритм сортировки выбором) и определение наиболее оптимального для решения задач вычисления массивов данных на языке программирования С++. Для того, чтобы оценить эффективность выбранных алгоритмов («пузырьком» и выбором), было принято решение использовать их при решении ряда тестовых задач. И на основе полученных результатов загрузки процессора при вычислении этих задач сделать вывод об эффективности того или иного алгоритма сортировки.

В качестве тестовых задач были выбраны:

Задача №1. Дан одномерный массив. Отсортировать массив по возрастанию.

Задача №2.Отсортировать двумерный массив по возрастанию.

Основная кодовая конструкция реализации задачи №1 с использованием алгоритма сортировки методом

«пузырька»:

int main(int argc, char* argv[]) {

srand(time(NULL)); setlocale(LC_ALL, "rus"); cout << "Введите размер массива: "; int D;

cin >> D; //Ввод размера функции int *massiv = new int [D]; for (int i = 0; i < D; i++) //Заполнение массива случайными данными

{

massiv[i] = rand() % 100 + 1;

cout << setw(2) << niassiv|i| << " ";

}

cout << "\n\n";

cout << " Отсортированый массив: "<<endl;

for (int i=D-1;i>0;i--) //Сортировка

пузырьком {

for (int j=0;j<i;j++) {

if(massiv[j]>massiv[j+1])

{

int t=massiv[j|; massiv[j]=massiv[j+1|;

massiv[j+1]=t; }

} }

for (int i = 0; i < D; i++)//Вывод

массива {

cout << setw(2) << massiv[i] << " ";

}

cout << "\n\n"; system("pause");

return 0;

}

При выполнении программного кода тестовой задачи №1, написанного на языке программирования Си с использованием алгоритма сортировки методом «пузырька» приведенного выше, были сняты следующие показания загрузки процессора (рисунок 1)

Рисунок 1 - Загрузка процессора при выполнении задачи №1, реализованной с помощью алгоритма сортировки методом «пузырька»

Основная кодовая конструкция реализации задачи №1 с использованием алгоритма сортировки методом выбора: void choicesSort(int*, int);

int main(int argc, char* argv[]) {

srand(time(NULL)); setlocale(LC_ALL, "rus"); cout << "Введите размер массива: "; int D;

cin >> D; //Ввод размера функции

int *massiv = new int [D];

for (int i = 0; i < D; i++) //Заполнение

массива случайными данными {

massiv[i] = rand() % 100 + 1;

cout << setw(2) << massiv[i] << " ";

}

cout << "\n\n";

choicesSort(massiv, D); //Вызов функции сортировки

for (int i = 0; i < D; i++)//Вывод

массива на экран {

cout << setw(2) << massiv[i] << " ";

}

cout << "\n"; system("pause");

return 0;

}

void choicesSort(int* arrayPtr, int length_array) //Реализация функции

сортировки выбором

{

for (int repeat_counter = 0; repeat_counter < length_array;

repeat_counter++) {

int temp = arrayPtr[0|; for (int element_counter = repeat_counter + 1; element_counter <

length_array; element_counter++)

{

if (arrayPtr[repeat_counter| >

arrayPtr [element_counter])

{

temp = arrayPtr[repeat_counter|; arrayPtr[repeat_counter] = arrayPtr[element_counter|;

arrayPtr|element_counter| = temp;

}

} } }

При выполнении программного кода тестовой задачи №1, написанного с использованием алгоритма сортировки методом выбора, были сняты следующие показания загрузки процессора (рисунок 2).

Рисунок 2 - Загрузка процессора при выполнении задачи №1, реализованной с помощью алгоритма сортировки методом выбора

На основе полученных данных можно построить график загрузки процессора при вычислении тестовой задачи №1 на разных алгоритмах сортировки (рисунок 3).

Исходя из полученных данных, можно сделать вывод, что сортировка выбором более уместна для решения тестовой задачи №1.

При реализации тестовой задачи №2 также использовались 2 алгоритма сортировки: «пузырька» и сортировка выбором. Ниже приведена основная кодовая конструкция реализации задачи №2 с использованием алгоритма сортировки методом «пузырька»:

90 80 70 60 50 40 30 20 10 0

[

Ъ

□ Сортировка пузырьком

□ Сортировка выбором

Использование процессора

Процессы

Потоки

Рисунок 3 - График загрузки процессора при вычислении тестовой задачи №1 на разных алгоритмах сортировки

int main()

{

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

setlocale(LC_ALL, "Russian"); const int D = 5; unsigned short k; int i, j, i_min, sum;

int massiv[D][D]; srand(time(NULL));

for(i = 0; i < D; ++i) //Заполнение

случайными данными двухмерного массива {

for(j = 0; j < D; ++j) {

massiv[i][j] = rand()%50 + 1;

}

}

^^«"Начальная матрица: "<<endl;

for(i = 0; i < D; ++i) //Вывод

начальной матрицы на экран {

for(j = 0; j < D; ++j) {

cout << massiv[i][j] << '\t'; }

cout << endl;

}

cout << " Отсортированый массив: "<<endl;

for(int c=0;c<=(i*j);c++)

//Сортировка матрицы пузырьком по

возрастанию {

for(int i2=0;i2<i;i2++) {

for(int j2=0;j2<j-1;j2++) {

if(massiv[i2][j2]>massiv[i2][j2+1])

{

int temp=massiv[i2][j2]; massiv[i2][j2]=massiv[i2][j2+1];

massiv[i2] [j2+1]=temp;

}

} }

for(int x=0;x<j;x++) {

for(int z=0;z<i-1;z++) {

if(massiv[z] [x]>massiv[z][x+1]) {

int temp=massiv[z] [x]; massiv[z][x]=massiv[z] [x+1];

massiv[z][x+1]=temp; }

} } }

for(int i2=0;i2<i;i2++) //Вывод

матрицы на экран

{

for(int j2=0;j2<j;j2++) {

cout<<massiv[i2][j2]<<"\t"; }

cout<<"\n"; }

return 0;

}

При выполнении программного кода тестовой задачи №2, написанного на языке программирования Си с использованием алгоритма сортировки методом

«пузырька», были сняты следующие показания загрузки процессора (рисунок 4).

Рисунок 4 - Загрузка процессора при выполнении задачи №2, реализованной с помощью алгоритма сортировки методом «пузырька» Основная кодовая конструкция реализации задачи №2 с использованием

алгоритма сортировки методом выбора:

int main()

{

setlocale(LC_ALL, "Russian");

const int D = 5;

unsigned short k;

int i, j, i_min, sum;

int massiv[D][D];

srand(time(NULL));

for(i = 0; i < D; ++i) //Заполнение

двухмерного массива случайными данными

{

for(j = 0; j < D; ++j) {

massiv[i][j] = rand()%50 + 1;

}

}

cout<<"Начальная матрица:

"<<endl;

for(i = 0; i < D; ++i) //Вывод на экран

начальной матрицы

{

for(j = 0; j < D; ++j) {

cout << massiv[i][j] << '\t'; }

cout << endl;

}

int t1;

unsigned short minind, mm = D - 1;

for (i = 0; i < D; i++) //Реализация

сортировки матрицы выбором по

возрастанию

{

for (j = 0; j < mm; j++) {

minind = j;

for (k = j+1; k < D; k++)

if (massiv[i][minind] > massiv[i][k])

minind = k;

t1 = massiv[i][j];

massiv[i][j] = massiv[i][minind];

massiv[i][minind] = t1;

}

}

cout << "Отсортированый массив: " <<endl;

for(i = 0; i < D; ++i) //Вывод

отсортированной матрицы

{

for(j = 0; j < D; ++j) {

cout << massiv[i][j] << '\t'; }

cout << endl;

}

return 0;

}

При выполнении программного кода тестовой задачи №2, написанного с использованием алгоритма сортировки методом выбора, были сняты следующие показания загрузки процессора (рисунок 5).

Рисунок 5 - Загрузка процессора при выполнении задачи №1, реализованной с помощью алгоритма сортировки методом выбора

На основе полученных данных можно

построить график загрузки процессора при

вычислении тестовой задачи №2 на разных

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

алгоритмах сортировки (рисунок 6).

80 70 60 50 40 30 20 10 0

□ Сортировка пузырьком

Потоки

Использование Процессы

процессора

Рисунок 6 - График загрузки процессора при вычислении тестовой задачи №2 на разных алгоритмах сортировки Исходя из полученных данных, можно сделать вывод, что метод сортировки выбором является наиболее эффективным для решения данной задачи.

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

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Шилдт, Г. Самоучитель С++ / пер. с англ. - СПб.: ВНУ-Санкт-Петербург, 1998. - 620

с.

2. Джамса, К. Учимся программировать на языке С++ / пер. с англ. - М.: Мир, 1997. - 320

с.

3. Стивен Прата Язык программирования С++. Лекции и упражнения. 6-е изд. - М.: Вильямс, 2012.

4. Сэвитч, У. С++ в примерах / пер. с англ. - М.: ЭКОМ, 1997. - 736 с.

5. Дейтел, Х. Дейтел, П. Как программировать на С++ / пер. с англ. - М.: БИНОМ, 1998. - 1024 с.

6. Рао, С. Освой самостоятельно С++ за 21 день. - 7-е изд. - М.: Вильямс, 2013.

7. Страуструп, Бьерн. Язык программирования С++. Специальное издание / пер. с англ. - М.: Бином, 2011. - 1136 с.

8. Страуструп, Бьерн. Программирование. Принципы и практика использования С++ / пер. с англ. - М.: Вильямс, 2011. - 1248 с.

9. Лафоре, Р. Объектно-ориентированное программирование в С++ / пер. с англ. -СПб.: Питер, 2012. - 900 с.

10. Эккель, Брюс. Философия С++. Введение в стандартный С++ / пер. с англ. -СПб.: Питер, 2009. - 572 с.

11. Дейтел, Х.М. Как программировать на С++ / пер. с англ. - М.: Бином, 2008. - 1454 с.

i Надоели баннеры? Вы всегда можете отключить рекламу.