Реферат

Реферат Исследование алгоритмов сортировки в среде OC LINUX

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 26.12.2024




МИНИСТЕРСТВО ОБРАЗОВАНИЯ

РОССИЙСКОЙ ФЕДЕРАЦИИ

«МАТИ» – РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ

ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ им. К. Э. ЦИОЛКОВСКОГО

___________________________________________________________________
Кафедра «Моделирование систем и информационные технологии»
ОТЧЕТ   ПО   КУРСОВОЙ   РАБОТЕ

"ИССЛЕДОВАНИЕ АЛГОРИТМОВ СОРТИРОВКИ В СРЕДЕ OC LINUX"
                                                                                      Преподаватель:  Лидовский В.В.

                                                                                      Студент:             

                                                                                       Группа:                АСУ-2ДС-025

                                                                                      Вариант:                        11
2010г.


1.   Цель лабораторной работы :
Изучить временные характеристики алгоритмов сортировки данных различного объема, приобрести навыки работы в среде OC Linux.


2.   Краткая характеристика исследуемых алгоритмов





     2.1.Метод Шелла.

Этот метод является модификацией метода пузырька. Основная его идея заключается в том, чтобы вначале устранить массовый беспорядок в сортируемой последовательности, сравнивая далеко отстоящие друг от друга элементы. Интервал между сравниваемыми элементами постепенно уменьшают до единицы, т.е. на первом проходе гарантируется, что все элементы, расстояние между которыми L1 < N – 1, упорядочиваются друг относительно друга, на втором то же гарантируется для элементов, расстояние между которыми L2 < L1 и т.д. до последнего k-го прохода, когда должно выполняться Lk = 1. Обычно расстояния L для сортировки Шелла берутся из приблизительного соотношения Lk ≤ 2Lk-1 и L1N/2, но лучше для расстояний L брать простые числа, ближайшие к Lk, выбираемым по описанной выше схеме.
2.2.Сортировка массивом (хэширование).

Сортировка массивом – это самый быстрый метод сортировки, не лишенный, однако, множества существенных недостатков. Суть метода заключается в заполнении вспомогательного массива, содержащего элементов несколько больше, чем исходная последовательность. Заполнение этого вспомогательного массива происходит так: вычисляются значения некоторой монотонной функции, называемой хэш-функция, на элементах сортируемой последовательности и эти значения считаются индексами этих элементов в заполняемом массиве. Если же окажется, что подлежащий заполнению элемент вспомогательного массива уже занят, то происходит сдвиг соответствующих элементов этого массива так, чтобы образовалось «окно» для вносимого элемента и сохранялась упорядоченность между элементами. Функция должна выбираться так, чтобы её значения лежали внутри диапазона индексов вспомогательного массива. Например, если известно, что сортируемая последовательность состоит из натуральных чисел от 1 до N, то в качестве искомой функции можно взять . В общем случае, в качестве такой функции рекомендуется взять
                  

где A – это исходная последовательность (массив), Max(A) и Min(A) – максимальный и минимальный элементы А, B – это вспомогательный массив, а Size(B) – это его размер. Эта монотонная (почти линейная) функция гарантирует, что её значения на элементах сортируемого массива будут лежать в диапазоне от 1 до Size(B). Она определена только при Max(A) ≠ Min(A). Если же Max(A) = Min(A), то это означает, что массив состоит из одинаковых элементов, т.е. он отсортирован.
3.         Листинг исследовательской программы

type

  mass=array[1..16000] of longint;

const

  maxnumber=70000;

var

  i,m,k:byte;

  d,s:longint;

  t1,t2:array[1..4,1..7]of longint;

  basearray,basearraycopy:mass;

procedure exchange(a:longint;b:longint;var basearray:mass);

  var k:longint;

  begin

    k:=basearray[b];

    basearray[b]:=basearray[a];

    basearray[a]:=k;

  end;

procedure fillarray(size:longint;t:byte;var base:mass);

  var i:word;

  begin

    randomize;

    case t of

      1:begin

        base[1]:=maxnumber;

          for i:=2 to size do

            base[i]:=base[i-1]-random(maxnumber div size)-1

          end;

      2:begin

        base[1]:=1;

          for i:=2 to size do

            base[i]:=base[i-1]+random(maxnumber div size)+1

          end;

      3:for i:=1 to size do

        base[i]:=random(12)+1;

      4:for i:=1 to size do

        base[i]:=random(maxnumber)+1;

    end;

  end;

procedure shellsort(size:longint;var basearray:mass);

  var

    i,j,gap:longint;

  begin

   gap:=size div 2;

   while gap>0 do begin

     for i:=gap to size-1 do begin

       j:=i-gap+1;

       while basearray[j]<basearray[j+gap] do begin

         exchange(j,j+gap,basearray);

         if j>gap then j:=j-gap else break;

       end;

     end;

     gap:=gap div 2; 

   end;

  end;

procedure arraysort(size:longint;var basearray:mass);

  const

    factor:real=1.4;

  var

    i,j,l,p,minelem,maxelem,ubound:longint;

    k,m:longint;

    auxarray:array[1..22400] of longint;

  begin

   minelem:=basearray[1];

   maxelem:=basearray[1];

   for i:=2 to size do begin

     if maxelem<basearray[i] then

       maxelem:=basearray[i];

     if minelem>basearray[i] then

       minelem:=basearray[i];

   end;

   if maxelem=minelem then exit;

   ubound:=round(size*factor);

   for i:=1 to ubound do

     auxarray[i]:=0;

   for i:=1 to size do begin

     j:=(basearray[i]-minelem)*(ubound-1) div (maxelem-minelem)+1;

     if auxarray[j]=0 then

       auxarray[j]:=basearray[i]

     else begin

       if auxarray[j]>basearray[i] then begin

         while j>1 do

           if auxarray[j-1]>basearray[i] then

             dec(j)

           else

             break;

         m:=-1;

       end else begin

         while j<ubound do

           if (auxarray[j+1]<basearray[i])

                 and (auxarray[j+1]<>0) then

             inc(j)

           else

             break;

         m:=1;

       end;

       k:=0;

       repeat

         if (k+j>0) and (k+j<=ubound) then

           if auxarray[k+j]=0 then

             break;

         if k>0 then k:=-k else k:=1-k;

       until false;

       l:=j+k;

       if k>0 then k:=1 else k:=-1;

       j:=j+(m+k) div 2;

       while l<>j do begin

         auxarray[l]:=auxarray[l-k];

         l:=l-k;

       end;

       auxarray[j]:=basearray[i];

     end;

   end;

   j:=1;

   for i:=ubound downto 1 do

     if auxarray[i]<>0 then begin

       basearray[j]:=auxarray[i];

       inc(j);

   end;

  end;

procedure check_error(size:longint;basearray:mass);

  var

    i:longint;

  begin

    for i:=1 to size do

      if basearray[i]<basearray[i+1] then begin

        writeln('Error!');

          halt;

      end;

  end;

{$L timer.o}

procedure init_timer; cdecl; external;

function get_timer:longint; cdecl; external;

{$LinkLib c}

begin

  s:=250;

  writeln('Shellsort/Arraysort');

  for i:=1 to 7 do begin

    write(s:5,’:   |’);

    for k:=1 to 4 do begin

      fillarray(s,k,basearray);

      basearraycopy:=basearray;

      init_timer;

      shellsort(s,basearray);

      t1[k,i]:=get_timer;

      check_error(s,basearray);

      basearray:=basearraycopy;

      init_timer;

      arraysort(s,basearray);

      t2[k,i]:=get_timer;

      check_error(s,basearray);

      write(t1[k,i]:5,'/',t2[k,i]:6,'  |');

    end;

    s:=s*2;

    writeln;

  end;

end.



































4.   Описание исследовательской программы



Процедуры и функции:
exchange
(
a
:
longint
;
b
:
longint
;
var

basearray
:
mass
) –
процедура меняющая местами элементы с индексами a и b, в массиве basearray.

fillarray
(
size
:
longint
;
t
:
byte
;
var

base
:
mass
)
-
подготовка исходных данных : заполнение первых size элементов массива base одним из четырех способов, в зависимости от значения t:  “Упорядоченные” - элемент массива с меньшим индексом строго больше элемента с большим индексом(t=1); “Обратного порядка” - элемент массива с меньшим индексом строго меньше элемента с большим индексом(t=2);  “Вырожденные” - массив заполняется случайным образом числами из диапазона от 1 до 12(t=3); “Случайные” - массив заполняется случайным образом числами из диапазона от 1 до 70000(t=4).size – параметр типа longint, задает количество заполняемых первых элементов массива (250, 500, 1000, 2000, 4000, 8000 или 16000 элементов);

shellsort
(
size
:
longint
;
var

basearray
:
mass
)
 
процедура, сортирует первых size элементов массива basearray по убыванию методом Шелла.

arraysort(size:longint;var basearray:mass)процедура, обеспечивает сортировку массивом первых size элементов массива basearray по убыванию.

check
_
error
(
size
:
longint
;
basearray
:
mass
)
-  процедура для проверки правильности сортировки первых size элементов массива basearray, если он отсортирован правильно, то продолжается выполнение программы, если нет, то выдается сообщение об ошибке и выполнение программы прекращается.

   
init
_
timer
процедура, инициализирует (обнуляет) таймер (счетчик времени).

get
_
timer
– функция, возвращает количество микросекунд, прошедших с момента последнего обнуления таймера.
Директивы:
cdeclдиректива, применяется для обращения к статическим библиотекам, использующим соглашения языка C.

external – директива, указывает на неявный вызов подпрограммы.

{$
L

timer
.
o
}
директива, подключает подпрограммы из модуля timer.o.

{$
LinkLib

c
}
директива, подключает стандарты языка C.
Глобальные переменные:
i ,
k
временные переменная типа byte.

sвспомогательная переменная типа longint, необходимая для хранения размера массива.

t
1,
t
2
двумерные массивы из 28 элементов типа longint, необходимые для хранения значений времени сортировки для сортировки методом пузырька и сортировки выбором деревом соответственно.



Массивы:

b
asearray -
массив из 16000 элементов типа LongInt.

b
ase
a
rray
copy
копия сортируемого массива.

Auxarray
вспомогательный массив, состоящий из 16000*factor элементов типа LongInt, factor = 1.4


Константы:


maxnumber
     
вспомогательная константа, равная 70000

factor
константа, равная 1.4 = размер(auxarray)/размер(basearray)



Таблица и график результатов исследования



Таблица

Результатов исследования зависимости времени (в мс) сортировки массива от его размеров и способа заполнения.
                                                                                               

Алгоритм

Сортировка методом Шелла / Сортировка массивом

тип

Размер


Упорядоченные

Обратный порядок

Вырожденные

Случайные


250

0.016/0.042

0.040/0.035

0.043/0.074

0.064/0.039

500

0.033/0.067

0.109/0.067

0.086/0.202

0.148/0.074

1000

0.074/0.139

0.323/0.132

0.305/0.620

0.393/0.146

2000

0.165/0.262

0.552/0.262

0.448/2.132

0.895/0.309

4000

0.364/0.526

1.224/0.513

0.975/8.135

2.079/0.598

8000

0.802/1.015

2.716/1.010

2.244/29.419

4.607/1.207

16000

1.759/1.914

4.327/2.005

5.111/119.213

10.991/2.416

N

~N / N

~N / N

~N / N2

~N / N

График


Зависимости времени сортировки от размера сортируемой  последовательности, заполненной случайным образом.
    


                                    Начало

     



                       Задание размера массива и типа

                                его заполнения




            

Заполнение массива






          Сохранение копии массива








        Обнуление таймера






     Сортировка методом Шелла






   Получение времени сортировки



             

                                   Проверка,               

               правильно ли отсортирован        нет  

     массив?
   Да



Восстановление исходного

массива из копии





                               Обнуление таймера






                             Сортировка массивом






                         Получение времени сортировки





Проверка,             Нет

правильно ли отсортирован

Подпись: Вывод сообщения об ошибке                              массив?

   Да



                             Проверка,

Да         есть ли неисследованные             

комбинации размера массива и

                            типа его заполнения?
Нет



Вывод результатов






6.   Анализ результатов эксперимента
     

В результате исследования я установил, что метод Шелла является более эффективным по сравнению с сортировкой массивом при сортировке упорядоченных и вырожденных данных, причем преимущество в скорости в случае с вырожденными данными возрастает с увеличением количества сортируемых элементов, что объясняется многочисленными перестановками при сортировке часто повторяющихся данных в алгоритме сортировки массивом. Метод Шелла приблизительно одинаково эффективен при упорядочивании данных любого типа и время сортировки пропорционально количеству элементов в массиве. А вот со случайными данными и данными обратного порядка очень быстро справляется сортировка массивом, опережая сортировку методом Шелла.
7.   Выводы



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

1. Диплом Методика і організація занять із дітьми, які мають враження слуху
2. Реферат Социальная роль базы данных
3. Реферат SCM как фактор повышения конкурентоспособности бизнеса
4. Реферат на тему Необходимость и сущность денег 2
5. Реферат Услуги общественного питания 2
6. Курсовая Анализ экономических показателей фитнес-клуба Заводной
7. Статья Экономическая эффективность занятий оздоровительной физической культурой
8. Реферат на тему Korea Essay Research Paper Korea
9. Курсовая Вплив морфологічних показників дівчаток 11-12 років що займаються художньою гімнастикою на
10. Курсовая Формирование конкурентоспособности региона на примере Республики Карелия