1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
СУТЬ: задание состоит из двух подзаданий: Разработать программы, реализующие сортировки: 1. Методом Шелла 2. Естественным двухпутевым слиянием Исследовать работу программы на сортировке n чисел, если они: a) расположены случайным образом; B) отсортированы; c) отсортированы в обратном порядке; С первым подзаданием справилась:
uses Crt,Dos; const ARRAYSIZE=5000; type arrayType=array[1..ARRAYSIZE] of integer; var A:arrayType;{Сортируемый вектор} n:integer;{Количество точек в сортируемом векторе} exp:integer;{Количество проводимых экспирементов} point:byte;{Количество точек требуемое для построения графика} step:integer;{Шаг для построения графика} i,j,k:integer;{Переменные цикла} c:integer;{Вспомогательная переменная для обмена двух элементов} f:text;{Файловая переменная для записи результатов} t:real;{Время сортировки вектора} aver_time:array[1..3]of real;{среднее время сортировки при разном расположении} {элементов (1-случайный порядок, 2-обратный,3-прямой)}
procedure InsertionSort(Size:integer;var theArray:arrayType; var time:real); var newPos:integer;{Начальная позиция вставляемого на место элемента} newValue:integer;{Значение вставляемого на место элемента} currentPos:integer;{Позиция вставляемого эл. в упорядоченном векторе} hour,min,sec,hund:word;{текущее время (час, мин, сек, сотые} start_time,finish_time:real;{время начала и окончания сортировки вектора} h,t,s:word; begin {Вычисление шага сортировки} t:=1; h:=1; While h<Size do begin t:=t+1; h:=3*h+1; end; if t>2 then begin t:=t-2; h:=round(h/3); end;
GetTime(hour,min,sec,hund); {фиксируем время начала сортировки} start_time:=sec+hund*0.01+min*60+hour*3600; {переводим время в секунды} {Алгоритм сортировки} for s:=t downto 1 do begin h:=round(h/3); for newPos:=h+1 to SIZE do begin newValue:=theArray[newPos]; currentPos:=newPos-h; while (currentPos>=1)and(theArray[currentPos]>newValue)do begin theArray[currentPos+h]:=theArray[currentPos]; currentPos:=currentPos-h; end; theArray[currentPos+h]:=newValue; end; end; GetTime(hour,min,sec,hund);{фиксируем время окончания сортировки} finish_time:=sec+hund*0.01+min*60+hour*3600;{переводим время в секунды} time:=finish_time-start_time;{определяем фактическое время сортировки} end;{InsertionSort}
procedure Vector(SIZE,MAX:integer;var theArray:arrayType); var i:integer;{Номер текущего элемента вектора} begin randomize; for i:=1 to SIZE do theArray[i]:=random(MAX); end;{Vector}
{Основной модуль} begin ClrScr; assign(f,'c:\primer\ins');{инициализация выходного файла} rewrite(f); write('Введите необходимое количество точек для построения графика ->'); readln(point); step:=round(ARRAYSIZE/point); write('Введите количество экспериментов ->'); readln(exp); {Формирование заголовка таблицы} writeln(f,'Среднее время сортировки элементов:'); writeln(f,' кол-во ',' случайные',' обратное',' сортиров.'); writeln(f,'элементов'); for k:=1 to point do begin n:=step*k;{определение длины вектора для k шага} for i:=1 to 3 do aver_time[i]:=0.0; {обнуление времени} for j:=1 to exp do begin vector(n,ARRAYSIZE,a);{формирование произвольного вектора длинны n} InsertionSort(n,a,t);{сортировка произвольного вектора} {накопление времени для определения среднего} aver_time[1]:=aver_time[1]+t; {формирование вектора в обратном порядке} for i:=1 to n div 2 do begin c:=a[i]; a[i]:=a[n-i+1]; a[n-i+1]:=c; end; InsertionSort(n,a,t);{сортировка обратно сортированного вектора} aver_time[2]:=aver_time[2]+t; InsertionSort(n,a,t);{сортировка упорядоченного вектора} aver_time[3]:=aver_time[3]+t; end; {нахождение среднего времени сортировки, исходя из m экспериментов} for i:=1 to 3 do aver_time[i]:=aver_time[i]/exp; {заполнения таблицы результатов в файле} write(f,n:7,' '); for i:=1 to 3 do write(f,aver_time[i]:7:2,' '); writeln(f); end; close(f); end.
а вот со вторым - ни в какую!!! смысл тот же, а вот с примером, ссылка на который приведена выше, разобраться не могу не понимаю, зачем там необходимы целых ТРИ внешних файла? и как переписать его так, чтобы этих внешних файлов не было вообще - просто случайный вектор, просто сортировка / внешний файл - только один - с результатами подсчета времени. помогите, пожалуйста!!!