Реферат: Сортировка массивов методом вставок
Название: Сортировка массивов методом вставок Раздел: Рефераты по информатике, программированию Тип: реферат |
Министерство Образования и Науки Украины Национальный Аэрокосмический Университет им. Н. Е. Жуковского “ХАИ” Кафедра 302 Домашнее задание по курсу „Программирование и алгоритмические языки” по теме: „СОРТИРОВКА МАССИВОВ МЕТОДОМ ВСТАВОК” Выполнил: студент 326 группы Чаплыгин В. И. Проверил: Момот М. А. Харьков 2003 Содержание1. Постановка задачи ……………………………………………………………… 3 2. Теоретическое обоснование и алгоритм решения задачи …………………… 3 3. Пример работы программы ……………………………………………………. 4 4. Исходный код программы с комментариями …………...……………………. 9 5. Список литературы …………………………………………………………… 13 6. Приложение 1: блок-схема программы ……………………………………... 14 7. Приложение 2: блок-схема функции сортировки (SortByIncrease()) ……… 15 Постановка задачи Задание: Упорядочить массив x по убыванию или возрастанию (т.е. переставить его элементы так чтобы для всех k выполнялось xk <=xk-1 или xk >=xk-1 соответственно), используя следующий алгоритм сортировки (упорядочивания): сортировка вставками : пусть первые k элементов массива уже упорядочены по не убыванию; берется (k +1)-й элемент и размещается среди первых k элементов так, чтобы упорядоченными оказались уже k +1 первых элементов; этот метод применяется при k от 1 до n-1. Основные требования к программе: · В программе должны использоваться функции, для которых следует явно сопоставить прототипы (объявления, описания), определения и вызовы. · Как минимум в одной функции должны быть параметры по умолчанию и соответственно в программе должны быть вызовы такой функции в разной форме. · Использовать все циклы С++. · Доступ к элементам массива по [] и *. · Заполнение массива случайным образом. · Программа должна создаваться из проекта, содержащего несколько файлов исходного кода (*.h, *.срр). · Должны использоваться уловная компиляция (стражи включения). · Программа должна иметь дружественный интерфейс - основные операции должны вызываться через соответствующие элементы текстового меню. · Итерации в текстовый файл отчета. · Передача имени файла отчета в командной строке. · Считывание исходных данных из файла. · Использование параметров командной cтроки. Теоретическое обоснование метода «Сортировка при помощи прямого включения» и алгоритм решения задачи Метод основывается на следующем: считается, что перед рассмотрением записи R[j] предыдущие записи R[1],R[2],...,R[j-1] уже упорядочены, и R[j] вставляется в соответствующее место. Сортировка таблицы начинается со второй записи. Ее ключ сравнивается с ключом первой записи, и, если упорядоченность нарушена, то записи R[1] и R[2] переставляются. Затем ключ записи R[3] сравнивается с ключами записей R[2] и R[1]. Как только программа обнаруживает, что (j+1)-й элемент массива меньше (при сортировке по возрастанию) j-го элемента, она копирует значение этого элемента в буферную переменную и с начала массива до j анализирует, пока значение буферной переменной не будет меньше какого-либо элемента х. Затем кусок массива, начиная с х и до j, перемещается на одну ячейку в сторону возрастания, и на образовавшееся место х записывается значение перемещаемого элемента. Дальше продолжается перемещение по основному массиву до элемента n-1 (т.к. мы сравниваем j-й и (j+1)-й элементы): 41 54 10 66 27 42 80 61 43 37 ^ <~~ 10 41 54 66 27 42 80 61 43 37 ^ <~~ 10 27 41 54 66 42 80 61 43 37 ^ <~~ 10 27 41 42 54 66 80 61 43 37 ^ <~~ 10 27 41 42 54 61 66 80 43 37 ^ <~~ 10 27 41 42 43 54 61 66 80 37 ^ <~~ 10 27 37 41 42 43 54 61 66 80
см. приложение 2. Пример работы программы Запускаем программу InsetSort: Программа прелагает нам выбрать один из пунктов меню для выполнения соответствующей операции. Итак, выбираем 1: Введем желаемое количество элементов массива. Массив создан. Теперь можно вывести массив на экран, добавить некоторое количество элементов, найти какой-либо элемент по значению и т.д. Выведем массив на экран. Также эта программа предоставляет возможность удалить какой-либо элемент, введя его порядковый номер. Допустим, мы хотим удалить элемент под номером 7 со значением 89, затем выведем снова массив на экран: Теперь добавим 6 элементов к существующему массиву: В программе реализована функция чтения из файла. Если задано три параметра запуска программы, то она принимает argv[2], как название файла, из которого будет происходить считывание информации. Если же задано меньшее количество параметров, то InsetSort предложит ввести названии файла в течении выполнения программы. Перед выбором пункта 7 (Open File) необходимо очистить массив (пункт 6), иначе программа сигнализирует об ошибке. А после выбора элемента меню 7 введем название считываемого файла данных, если это необходимо. (Первым элементом файла должно быть число, значение которого равно количеству элементов в файле.) Проделаем вышеуказанные действия и выведем результат на экран: При выборе пункта 9 у нас будет возможность отсортировать массив элементов, как по возрастанию, так и по убыванию. Например, отсортируем существующий массив по возрастанию и выведем результат на экран: В итоге мы получили отсортированный массив и массу удовольствия при работе в этой чудотворной программе. А кроме этого еще и файл отчёта, в который были записаны все шаги к полной сортировке массива. Помните , что файл будет создан только после корректного завершения программы InsetSort. Исходный код программы с комментариями ----------------------------------------------------------------- MAIN.CPP #include "func.h" int menu(); ofstream f; char fname[20],foname[20]; int *MasP[100]={0},n=0,argcGlobal; ////////////////////MAIN///////////////////// int main(int argc,char *argv[]){ // int M[10]; int bool=0;//Ïåðåìåííàÿ, ïðèíèìàþùàÿ äâà çíà÷åíèÿ.(Äëÿ âûõîäà) argcGlobal=argc; if (argc>1)//Åñëè çàäàí ïàðàìåòð, òî ïðèíÿòü åãî strcpy(fname,argv[1]);//êàê íàçâàíèå äëÿ ôàéëà îò÷åòà. else strcpy(fname,"Log.txt"); if (argc>2) strcpy(foname,argv[2]);//Âòîðîé àðãóìåíò - äëÿ ÷òåíèÿ. f.open(fname);//Ñîçäàíèå è ïîäãîòîâêà ôàéëà ê çàïèñè. do{//Âûïîëíÿòü ïîêà bool=0. bool=menu();//Áàçîâàÿ ôóíêöèÿ ïðîãðàììû. }while (bool==0); f.close();//Çàêðûòèå ôàéëà è çàïèñü íà ÆÄ. cout<<"\n\n\n\n\n\n\n\n\n\n"; cout<<"InsetSort. v 0.3 (C) 2003-2004 Created by Chaplygin Vasilij."; cin.get(); cin.get(); return 0; } ////////////////////MENU//////////////////// int menu(){ cout<<endl<<" Main Menu:"<<endl; cout<<" 1. Make New List." <<endl; cout<<" 2. Add Element." <<endl; cout<<" 3. Print List." <<endl; cout<<" 4. Delete Element."<<endl; cout<<" 5. Save List." <<endl; cout<<" 6. Erase List." <<endl; cout<<" 7. Open File." <<endl; cout<<" 8. Find Element." <<endl; cout<<" 9. Sort List." <<endl; cout<<" 0. Exit." <<endl; cout<<endl<<"Your choice : "; int i; do {cin>>i; if (i<0 || i>9) cout<<endl<<"Error! Try again : "; } while (i<0 || i>9); switch (i) {case 1 : MakeNewList(); break; //Make New List case 2 : AddElements(); break; //Add Element case 3 : PrintList(); break; //Print List case 4 : DeleteElement(); break; //Delete Element case 5 : SaveList(); break; //Save List case 6 : n=0; break; //Erase List case 7 : OpenList(); break; //Open File case 8 : FindElement(); break; //Find Element case 9 : SubMenu(); break; //Sort List case 0 : return -1; //Exit } return 0; }//menu ----------------------------------------------------------------- func.cpp #include "func.h" extern int *MasP[100],n,argcGlobal; extern ofstream f; const int N=100; //////////////////MakeNewList////////////////// void MakeNewList(){ if (n!=0) {cout<<endl<<"Error! You have existing list."; cout<<endl<<"Erase your prvious list ang try again."<<endl;} else {cout<<endl<<"Input quantity of elements: "; do{ cin>>n; if ((n<1)||n>N){ cout<<endl<<"The quantity is incorrect!"<<endl; cout<<"Max quantity of elemets: "<<N<<endl; cout<<"Try again: ";} }while ((n<1)||(n>N)); srand(time(NULL)); for (int i=0; i<n; i++){ MasP[i]=new int; *MasP[i]=rand()%100;} } } //////////////////AddElements/////////////////// void AddElements(){ cout<<endl<<"Input quantity of elements: "; int p; do{ cin>>p; if ((p<1)||((n+p)>N)){ cout<<endl<<"The quantity is incorrect!"<<endl; cout<<"You have "<<N-n<<" free cells."<<endl; cout<<"Try again: ";} }while ((p<1)||((n+p)>N)); srand(time(NULL)); for (int i=n; i<(n+p); i++){ MasP[i]=new int; *MasP[i]=rand()%100;} n=n+p; } ////////////////////PrintList/////////////////// void PrintList(){ if (n==0) cout<<endl<<"List is empty."<<endl; else{ cout<<endl; for(int i=0; i<n; i++){ if (i%10==0) cout<<endl; cout<<setw(3)<<*MasP[i];} cout<<endl; } } ////////////////DeleteElement/////////////////// void DeleteElement(){ if (n==0) cout<<endl<<"List is empty."<<endl; else{ cout<<endl<<"Input number of element: "; int p; do{ cin>>p; if ((p<0)||(p>n)) cout<<endl<<"Error! Try again: ";} while ((p<0)||(p>n)); cout<<endl; for (int j=(p-1); j<n; j++) MasP[j]=MasP[j+1]; MasP[n]=0; n--; } } ////////////////////Save List///////////////////// void SaveList(){ if (n==0) cout<<endl<<"List is empty."<<endl; else{ for (int i=0; i<n; i++){ if (i%10==0) f<<endl; f<<setw(3)<<*MasP[i];} f<<endl; } } ///////////////////FindElement//////////////////// void FindElement(){ if (n==0) cout<<endl<<"List is empty."<<endl; else{ cout<<endl<<"Input the value, which must be finded: "; int a,s=0; cin>>a; for (int i=0; i<n; i++){ if (*MasP[i]==a) { cout<<endl<<(i+1)<<"-th element"<<" - "<<*MasP[i]; s=i;}} if (s==0) cout<<endl<<"The existing list hasn't element with this value"; cout<<endl; } } //////////////////SubWork(Sort)/////////////////// void SubMenu(){ if (n==0) cout<<endl<<"List is empty."<<endl; else{ cout<<endl<<" Sub Menu:"<<endl; cout<<" 1. Sort list by increase."<<endl; cout<<" 2. Sort list by decrease."<<endl<<endl; int i; cout<<"Your choice: "; do { cin>>i; if (i<1 || i>2) cout<<endl<<"Error! Try again : "<<endl; }while (i<1 || i>2); switch (i) {case 1 : SortByIncrease(); break; //Increase case 2 : SortByDecrease(); break; //Decrease } } } /////////////////SortByIncrease////////////////// void SortByIncrease(){ int buf; for (int i=0; i<(n-1); i++){ if (*MasP[i]>*MasP[i+1]){ SaveList(); buf=*MasP[i+1]; for (int j=0; j<(i+1); j++){ if (buf<*MasP[j]){ for (int q=i+1; q>j; q--) *MasP[q]=*MasP[q-1]; *MasP[j]=buf; break; }//Incert place }//for Incert place }//Find unsorted element }//for Find unsorted element SaveList(); } /////////////////SortByDecrease////////////////// void SortByDecrease(){ int buf; for (int i=0; i<(n-1); i++){ if (*MasP[i]<*MasP[i+1]){ SaveList(); buf=*MasP[i+1]; for (int j=0; j<(i+1); j++){ if (buf>*MasP[j]){ for (int q=i+1; q>j; q--) *MasP[q]=*MasP[q-1]; *MasP[j]=buf; break; }//Incert place }//for Incert place }//Find unsorted element }//for Find unsorted element SaveList(); } ///////////////////Open File///////////////////// void OpenList(char s[20]){ if (n!=0) {cout<<endl<<"Error! You have existing list."; cout<<endl<<"Erase your prvious list ang try again."<<endl;} else { if (argcGlobal<3){ cout<<endl<<"Input file name: "; char *FileName=new char[20]; cin>>FileName; s=FileName;} ifstream fo(s,ios::nocreate); if (! fo) cout<<"File not found."<<endl; else{ int b; fo>>b; for (int i=0; i<b; i++){ if (n==N) break; MasP[n]= new int; fo>>*MasP[n]; n++; } }//if (! fo)... } } ------------------------------------------------------------------- func.h //Ïîäêëþ÷àåì ñòðàæè âêëþ÷åíèé. #ifndef __func_h #define __func_h #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <iomanip.h> #include <string.h> #include <time.h> extern char foname[20]; //Ïðîòîòèïû ôóíêöèé. void MakeNewList(); void AddElements(); void PrintList(); void DeleteElement(); void SaveList(); void EraseList(); void FindElement(); void SubMenu(); void SortByIncrease(); void SortByDecrease(); void OpenList(char s[20]=foname); #endif Список литературы 1. Лафоре Р. Объектно-ориентированное программирование в С++ , 4-е изд. - СПб.: Питер, 2003. – 928 с.: ил. 2. Дейтел Х.М., Дейтел П.Дж. Как программировать на С++ .. – М.: Бином, 1999. - 1024 с. 3. Страуструп Б. Язык программирования С++ , 3-е изд. - СПб.; М.: Невский Диалект - Бином, 1999. - 991 с. 4. Керниган Б., Ритчи Д. Язык программирования Си. \Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.
Примечание 1. Примечание 2. |