Автор работы: Пользователь скрыл имя, 30 Мая 2013 в 19:56, курсовая работа
Основной целью работы является разработка программы наглядно демонстрирующей методы быстрой сортировки.
Составить алгоритм решения задачи. Отобразить на экране в пошаговом и автоматическом режиме сортировку данных «быстрым методом». Вывести значения числа сравнений и числа перестановок.
1.Цель работы 5
2. Описания метода решения задачи. 6
3.Описания программы и используемых алгоритмов 7
5.Описание методики тестирования программы 8
6.Руководство пользователя по работе с программой 9
7.Заключение 10
8.Список используемой литературы. 11
Приложение А 12
Приложение Б 20
Министерство образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра радиоэлектроники и защиты информации (РЗИ)
Курсовая работа на тему
«Демонстрационная программа сортировки «быстрым» методом»
Выполнил:
Студент группы 1А2
______Тихонов В.А.
«__»__________2013
Проверил:
Аспирант кафедры РЗИ
______Чечулин С.О.
«__»__________2013
Томск 2013
Реферат
Курсовая работа 20 страниц, 3 рисунка, 4 источника, 2 приложения.
Демонстрационная программа
1.Цель работы 5
2. Описания метода решения задачи. 6
3.Описания программы и используемых алгоритмов 7
5.Описание методики тестирования программы 8
6.Руководство пользователя по работе с программой 9
7.Заключение 10
8.Список используемой литературы. 11
Приложение А 12
Приложение Б 20
1.Цель работы
Основной целью работы является разработка программы наглядно демонстрирующей методы быстрой сортировки.
Составить алгоритм решения задачи. Отобразить на экране в пошаговом и автоматическом режиме сортировку данных «быстрым методом». Вывести значения числа сравнений и числа перестановок.
2. Описания метода решения
«Основная идея, на которой базируется этот метод состоит в том, чтобы взять одну из записей, скажем R1 и передвинуть ее на то место, которое она должна занять после сортировки» скажем в позицию s. В поиске этой окончательной позиции придется несколько перекомпоновать и остальные записи таким образом, чтобы слева от позиции s не оказалось ни одной записи с большим ключом, а справа — с меньшим. В результате последовательность окажется разбитой таким образом, что исходная задача сортировки всего массива записей будет сведена к задачам независимой сортировки пары подмассивов R1...RS-1 и RS+1…Rn меньшей длины. Далее, тот же метод применяется и к полученным подмассивам до тех пор, пока не будет завершена сортировка всей последовательности.
Существует несколько способов разбиения всей последовательности на подмассивы. Рассмотрим следующую процедуру, предложенную Седгевиком, которая, на наш взгляд, является лучшей из имеющихся на сегодняшний день, в основном, вследствие своей "прозрачности" и простоты анализа алгоритма.
Итак, выбираем опорный элемент R1 и указатели i и j причем вначале i=2 и j=N. Увеличивая значения i и j на 1, сравниваем элементы Ri и Rj с опорным элементом R1, до тех пор пока не найдем элемент больше и меньше опорного соответственно. Если i < j, поменяем местами Ri с Ri, затем повторим аналогичную процедуру со следующей записью, "сжигая свечку с обоих концов" пока не станет i > j. Завершается процесс разделения массива обменом записей R1 с Ri. Посмотрим, например, что произойдет с нашей последовательностью из шестнадцати чисел.»
Пример одной итерации представлен на рис 3.1
Рис.3.1 Пример одной итерации быстрой сортировки.
Для удобства анализа указатели i и j ключи К1 и К2 выделены полужирным шрифтом.
3.Описания программы и
В программе используется несколько алгоритмов.
Алгоритм вывода на экран массива:
С помощью цикла проходим весь массив, используя функцию itoa, превращаем численные переменные в строковые и выводим их на экран функцией outtextxy, при этом изменяя цвет указателей и опорного элемента.
Алгоритм защиты от неправильного ввода, при работе с пользователем:
Используя ASCII коды клавиш, проверяем введенную последовательность. При наличии символов, отличных от цифр, пробела и конца строки, выводим сообщение об ошибке.
Алгоритм быстрой сортировки:
Передаются номера на первого и последнего элемента. Создаются переменные j,i.
Наращиваются
созданные переменные при условии
выполнения неравенств:
для j: A[j]>x &&j>0
для I: A[i]>x &&i<n+1
Проверяется местоположение переменных, происходит обмен элементов, если i < j.
При наличии двух и более элементов справа или слева, рекурсивно сортируются правый и левый массив соответственно.
5.Описание методики
Программа тестировалась введением некорректных данных с клавиатуры. Введением букв, лишних цифр, математических символов и знаков пунктуации, проверялась на переполнение. Найденные ошибки устранены.
Пример работы программы.
Рис 5.1 Ввод начальных данных
Рис 5.2 Пример работы программы
6.Руководство пользователя по работе с программой
1)Запустите quicksort.exe
2)Выберите количество сортируемых элементов
3)Выберете ввод данных: случайные числа или с клавиатуры.
4)введите данные (при выборе «с клавиатуры»)
Примечание:
Следует учитывать:
1. Количество сортируемых
2. Максимальный элемент
3. Программа предназначена для работы с целыми числами.
В случае несоблюдения выше перечисленных пунктов, программа будет выдавать сообщение об ошибке и запросит повторный ввод.
7.Заключение
В ходе данной работы я составил программу демонстрирующую сортировку быстрым методом. Данный метод считается одним из самых быстродействующих (на практике) из алгоритмов внутренней сортировки общего назначения.
1. Лучший случай: N lg N сравнений
2. Средний случай: O(n log n) перестановок
3. Худший случай: O(n²) перестановок
Высоко эффективен при сортировки
большего числа элементов, при малом
числе элементов эффективность
уменьшается. Можно существенно
увеличить эффективность
8.Список используемой
Приложение А
Текст программы
//Курсовая работа
#include <locale.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <graphics.h>
int A[40],n,sravn=0,perest=0,o=0;
//Функция защиты
int defence (int gran_min,int gran_max,int &cifra)
{ int key=32,schet=0;
cifra=0;
fflush(stdin);
key=getchar();
while (key==32) key=getchar();
while (key==48) key=getchar();
while (key!='\n'&& key!=32)
{if ((key>47 && key<58))
{cifra=cifra*10+(key-48);schet ++; // «собираем» число из цифр
}
else
{printf("Ошибка! Не совпадает с возможным \n");
Sleep (1000);
system("cls");
return 0;
}
key=getchar(); //считываем последующий за последней цифрой символ
}
if (key==32)
{while (key==32) key=getchar(); //избавляемся от лишних пробелов
if (key!='\n')
{printf("Ошибка! Не совпадает с возможным \n");
Sleep (1000);
system("cls");
return 0;
}
}
if(cifra<gran_min||cifra>gran_
{printf("Ошибка! Не совпадает с возможным \n");
Sleep (1000);
system("cls");
return 0;
}
else return 1;
}
//Фунция вывода массива на экран
void print_a(int l , int p, int s)
{int g,; char t[3];
for (g=0;g<n;g++)
{itoa(A[g],t,10);
if (g==l || g==p )setcolor(2);
else setcolor (7);
if (g==s) setcolor (4);
outtextxy(g*30,o*20,t);
}
o++;getch();
}
//Алгоритм быстрой сортировки
void quicksort(int lef, int prav)
{setcolor (15);
outtextxy(0,o*20,"Мы выбираем опорный элемент (красный), который поделит массив чисел на два подмассива:");
o++;
outtextxy(0,o*20,"меньше и больше элемента стоящего на месте опорного.А так же выбираем элементы на коротрые указывают указатели (зеленые)");
o++;
//объявление указателей и опорного элемента
int i=lef+1;
int j=prav;
int x=A[lef];
int x_i=lef;
print_a(i , j,x_i);
//сортировка подмасива
while(i<=j)
{ setcolor (15);
outtextxy(0,o*20,"Поочередно находим элементы больше опорного и меньше опорного");
o++;
print_a(i , j,x_i);
//нахождения элементов для обмена
while (A[i]<x && i<prav+1) { ++i; print_a(i , j,x_i);sravn++;}
while (A[j]>x &&j>0) {--j; print_a(i , j,x_i);sravn++;}
if(i <= j)
{ setcolor (15);
outtextxy(0,o*20,"Поменяем местами найденные элементы");
o++;
int temp=A[i];
A[i]=A[j];
A[j]=temp;
print_a(i , j,x_i);
++i;--j; perest++;
}
}
setcolor (15);
outtextxy(0,o*20,"Поменяем местами опорный и последний найденный элемент т.к. указатели поменялись");
o++;
//обмен опороного элемента с последним найденным
int temp=A[lef];
A[lef]=A[j];
A[j]=temp;
perest++;
print_a(i , j,j);
setfillstyle ( 1, 0 );
bar ( 0, 0, 1366,768 );
o=0;
//рекурсивыный вызов для
if(lef < j-1) quicksort( lef, j-1);
if(j+1 < prav) quicksort( j+1, prav);
}
main()
{//блок обяъявления
setlocale(LC_CTYPE,"Russian");
int i,sp,max;
char ch='\n';
srand(time(NULL));
//ввод кол-ва символов
printf("Введи кол-во символов в массиве\n");
while (defence(2,40,n)!=1 )
{ printf("Введи кол-во символов в массиве\n");
}
//выбор заполнения
printf("Введите способ
while (defence(1,2,sp)!=1 ) printf("Введите способ заполнения массива\n 1-Случайные числа \n 2-С клавиатуры\n");
system("cls");
if (sp==1)
{ printf("Введи максимальный элемент массивa \n");
while(defence(0,99,max)!=1)
for (i=0;i<n;i++) A[i]=rand()%(max+1);
}
else
{
for (i=0;i<n;i++)
{ printf("Введи %d элемент массивa \n",i+1);
while(defence(0,99,А[i])!=1)
}
}
printf("Иссходная
for (i=0;i<n;i++)
{printf("%3d\t",A[i]);}
printf("\n\n");
initwindow(1366,768,"
settextstyle(8, 0, 1);
quicksort(0,n-1);
closegraph();
printf("\n\n");
printf("Отсортированная
for (i=0;i<n;i++) printf("%d \t",A[i]);
printf("\n\n");
printf("Кол-во сравнений %d\
system("pause");
}
Приложение Б
main:
!=1
Sp=1
нет да
Запроc на ввод максимального элемента
Информация о работе Демонстрационная программа сортировки «быстрым» методом