Анализ сортировок на двусвязном списке

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 20.02.2011
Размер файла 152,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Курсовая работа по предмету:

«Структуры и алгоритмы обработки данных»

«Анализ сортировок на двусвязном списке»

Задание

Реализовать сортировки на двусвязном списке в последовательной памяти. Провести сравнительный анализ их работы.

Теоретические сведения

Линейный список (ЛС) -- это конечная последовательность однотипных элементов (узлов). Количество элементов в последовательности называется длиной списка, причем длина в процессе работы программы может изменяться, поэтому ЛС - динамическая структура.

Над СД ЛС определены следующие основные операции:

1. Инициализация.

2. Включение элемента.

3. Исключение элемента.

4. Чтение текущего элемента.

5. Переход в начало списка.

6. Переход в конец списка.

7. Переход к следующему элементу.

7. Переход к i-му элементу.

8. Определение длины списка.

9. Уничтожение списка.

Кардинальное число СД ЛС определяется по формуле

CAR(ЛС)=CAR(BaseType)0 +CAR(BaseType)1+… +CAR(BaseType)max

где CAR(BaseType) - кардинальное число элемента ЛС типа BaseType, max - максимальное количество элементов в ЛС (не всегда определено, т.к. может зависеть от объёма свободной динамической памяти).

На абстрактном уровне ЛС представляет собой линейную структуру - последовательность.

На физическом уровне ЛС может быть реализован последовательной или связной схемой хранения. Располагаться ЛС может в статической или динамической памяти. ЛС, реализованный последовательной схемой хранения, называется последовательным линейным списком (ПЛС). ЛС, реализованный связной схемой хранения, называется связным линейным списком (СЛС). Для реализации ПЛС используется вспомогательная встроенная СД - массив, элементы которого могут быть элементами ПЛС. Доступ к элементам ПЛС - прямой. Для реализации СЛС используется множество связанных элементов типа “запись”, связь между которыми устанавливается с помощью поля-указателя. Элементы СЛС могут располагаться в массиве или в динамической памяти. СЛС подразделяются на односвязные линейные списки (ОЛС) и двусвязные линейные списки (ДЛС). В ОЛС каждый элемент состоит из информационного поля (поле данных) и одного поля-указателя, содержащего адрес следующего элемента. В ДЛС каждый элемент состоит из информационного поля и двух полей-указателей, одно из которых содержащих адрес следующего элемента в списке, а другое - предыдущего. Реализуется ОЛС, как правило, с первым фиктивным элементом, поле данных которого не используется, а ДЛС - с первым и последним фиктивным элементом. Введение фиктивных элементов позволяет упростить реализацию некоторых операций над ЛС.

Рассмотрим некоторые принципы реализации ЛС.

Реализация ПЛС.

Последовательному линейному списку можно поставить в соответствие дескриптор, который состоит из 3-х полей:

1 - массив, на основе которого реализуется ПЛС;

2 - индекс текущего элемента;

3 - длина ПЛС.

Дескриптор располагается в статической памяти в виде переменной соответствующего типа. Массив, на основе которого реализуется ПЛС, также располагается в статической памяти.

Дескриптор ПЛС состоит из 4-х полей:

1 - указатель на массив, на основе которого реализуется ПЛС;

2 - количество элементов массива;

3 - индекс текущего элемента;

4 - длина ПЛС.

Дескриптор располагается в статической памяти в виде переменной соответствующего типа. Массив, на основе которого реализуется ПЛС, располагается в динамической памяти. Память под массив выделяется при инициализации ПЛС и количество элементов этого массива заносится во второе поле.

Элементы ПЛС могут находиться непосредственно в элементах массива, или в динамической памяти, а их адреса - в массиве.

Реализация ДЛС.

В статической памяти находится дескриптор ДЛС, состоящий из 3-х полей:

1 - указатель на первый фиктивный элемент ДЛС;

2 - указатель на последний фиктивный элемент ДЛС;

3 - указатель на текущий элемент;

4 - длина ДЛС.

Адреса фиктивных элементов определяется при инициализации.

Элемент ДЛС может содержать либо поле данных, либо адрес данных и располагаться либо в динамической памяти, либо в массиве аналогично элементам ОЛС.

Временная сложность (ВС) алгоритма - это зависимость времени выполнения алгоритма от количества обрабатываемых входных данных. Здесь представляет интерес среднее и худшее время выполнения алгоритма. ВС можно установить с различной точностью. Наиболее точной оценкой является аналитическое выражение для функции: t=t(N), где t - время, N - количество входных данных (размерность). Данная функция называется функцией временной сложности (ФВС).

Например: t = 5N2 + 32N + 1. Такая оценка может быть сделана только для конкретной реализации алгоритма в конкретной вычислительной системе и не пригодна для оценки алгоритма. Для сравнения алгоритмов достаточно определить лишь порядок функции временной сложности t(N).

Две функции f1(N) и f2(N) -- одного порядка, если

Иначе это записывается в виде: f1(N)=О(f2(N)) (Читается " О большое ").

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

Для определения порядка функции ВС алгоритма достаточно найти зависимость числа выполнения того оператора от количества исходных данных, который выполняется в алгоритме чаще других.

Для оценки алгоритмов можно использовать функцию зависимости числа операций сравнения C=C(N) от количества обрабатываемых данных, т.к. функции t(N) и C(N) - функции одного порядка.

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

Формулировка задачи может быть записана следующим образом.

Если даны элементы а1, а2 ,…, аn, то сортировка означает перестановку этих элементов в массив ак1, ак2,…,акn, где при заданной функции упорядочения f справедливы отношения f(ак1)f(ак2) …f(акn). Обычно функция упорядочения f не вычисляется по какому-то специальному правилу, а является значением элемента.

Метод сортировки называется устойчивым, если относительный порядок элементов с одинаковыми значениями не меняется при сортировке; неустойчивым - в противном случае.

Методы сортировки, в зависимости от лежащего в их основе приема, можно разбить на три базовых класса:

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

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

сортировка обменом.

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

При сортировке выбором из множества не отсортированных элементов выбирают наименьший и присоединяют его к отсортированным ключам.

Алгоритм сортировки выбором

1. Находим наименьший ключ в неупорядоченной части массива.

2. Меняем местами найденный элемент с тем, который соседствует с упорядоченной частью.

3. Пункты 1 и 2 выполняем, пока в неупорядоченной части имеется более одного элемента.

Начальные значения

37

06

71

83

41

03

61

Проход 1

37

06

71

83

41

03

61

Проход 2

03

06

71

83

41

37

61

Проход 3

03

06

71

83

41

37

61

Проход 4

03

06

37

83

41

71

61

Проход 5

03

06

37

41

83

71

61

Проход 6

03

06

37

41

61

71

83

Проход 7

03

06

37

41

61

71

83

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

Анализ сортировки простым выбором

При сортировке простым выбором число сравнений ключей не зависит от их начального порядка. На первом просмотре выполняется N-1 сравнение, на втором -- N-2 и т.д. Следовательно, общее число сравнений равно (N-1) + (N-2) + (N-3) + ... + 1=N*(N-1)/2, что составляет O(N2). Порядок функции ВС не зависит от упорядоченности сортируемого массива, однако время сортировки упорядоченного массива будет минимальным, т.к. от упорядоченности массива зависит число перестановок элементов.

Сортировка обменом

Идея обменной сортировки заключается в том, что два элемента, нарушающие требуемый порядок, меняются местами.

Начальные значения

37

06

71

83

41

03

61

Проход 1

03

37

06

71

83

41

61

Проход 2

03

06

37

41

71

83

61

Проход 3

03

06

37

41

61

71

83

Проход 4

03

06

37

41

61

71

83

Проход 5

03

06

37

41

61

71

83

Проход 6

03

06

37

41

61

71

83

Проход 7

03

06

37

41

61

71

83

Алгоритм сортировки обменом

1. Перебираем поочередно все пары соседних элементов, начиная с последнего, и меняем местами элементы в парах, нарушающих порядок.

2. Пункт 1 повторяем n-1 раз.

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

Анализ сортировки обменом

При использовании сортировки обменом число сравнений элементов не зависит от их начального порядка. На первом просмотре выполняется N-1 сравнение, на втором -- N-2 и т.д. Следовательно, общее число сравнений равно (N-1)+(N-2)+(N-3)+...+1=N*(N-1)/2, что составляет O(N2).

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

Cортировка Хоара

Сортировка Хоара - лучший из известных до сего времени метод сортировки массивов. Он обладает столь блестящими характеристиками, что его изобретатель Ч. Хоар окрестил его быстрой сортировкой. Быстрая сортировка основана на том факте, что для достижения наибольшей эффективности желательно разбить массив на под массивы и сортировать под массивы меньшего размера.

30

10

40

20

15

17

45

60

(30

10

17

20

15)

(40

45

60)

Алгоритм быстрой обменной сортировки

1. Выбираем элемент массива в качестве разделителя.

2. Располагаем элементы меньшие разделителя в первой части массива, а большие - во второй.

3. Если число элементов в первой части массива больше 1, то применяем к ней алгоритм в целом.

4. Если число элементов во второй части массива больше 1, то применяем к ней алгоритм в целом. Конец алгоритма.

Данный алгоритм основан на том утверждении, что ни один из элементов, расположенных в первой части массива не обменяется с каким либо элементом, расположенным во второй части.

П.2 выполняется следующим образом: просматриваем массив от краев к центру и меняем местами элементы, нарушающие порядок.

Анализ сортировки Хоара

алгоритм сортировка

Пусть m=log2N, где N - количество элементов. Будем считать, что количество элементов, меньших разделителя, равно количеству элементов, больших разделителя, т.е. массив разбивается пополам на две равные части. Определим количество сравнений в этом случае:

N+2*(N/2)+…+m*(N/m)=O(N*m)=O(N*log2N).

Если каждый раз одна из частей массива содержит не более одного элемента, то порядок будет O(N2).

Характер разбиения массива, а, следовательно, и порядок функции ВС, зависит от соотношения разделителя и остальных элементов массива. Для определения “хорошего” разделителя имеются различные алгоритмы.

Текст программы

unit ListUnit;

interface

const

NOE = 200;

type

TDataType = Integer;

TIndex = 0..NOE;

TElement = record

Data: TDataType;

Next, Prev: TIndex;

end;

TOutputArray = array of TDataType;

TSerialList = object

private

NumberOfElements: TIndex;

Buffer: array [TIndex] of TElement;

OccupiedCells: array [TIndex] of Boolean;

Current: TIndex;

Head: TIndex;

Tail: TIndex;

NOC: Integer;

public

constructor Create;

destructor Destroy;

procedure SelectiveSort;

procedure QuickSort;

procedure ExchangeSort;

procedure GarbageCollector;

function Add(A: TDataType): Boolean;

function DeleteFirst(A: TDataType): Boolean;

function DeleteAll(A: TDataType): Boolean;

function Find(A: TDataType): Boolean;

function Read: TOutputArray;

function IsEmpty: Boolean;

function IsFull: Boolean;

function GetNOE: TIndex;

function GetNOC: Integer;

end;

implementation

{ TSerialList }

function TSerialList.Add(A: TDataType): Boolean;

begin

if IsEmpty then

begin

Head := 1;

Tail := 1;

Buffer[1].Data := A;

Buffer[1].Next := 0;

Buffer[1].Prev := 0;

OccupiedCells[1] := True;

Inc(NumberOfElements);

Result := True

end

else begin

if IsFull then

Result := False

else begin

Current := 1;

while OccupiedCells[Current] and (Current <= NOE) do

Inc(Current);

if Current > NOE then

Result := False

else begin

Buffer[Current].Data := A;

Buffer[Current].Prev := Tail;

Buffer[Current].Next := 0;

OccupiedCells[Current] := True;

Buffer[Tail].Next := Current;

Tail := Current;

Inc(NumberOfElements);

Result := True

end

end

end

end;

constructor TSerialList.Create;

begin

Head := 0;

Tail := 0;

NumberOfElements := 0;

Current := 1;

while Current <= NOE do

begin

OccupiedCells[Current] := False;

Inc(Current)

end

end;

function TSerialList.DeleteAll(A: TDataType): Boolean;

begin

Result := DeleteFirst(A);

if Result then

begin

while DeleteFirst(A) do;

Result := True

end

end;

function TSerialList.DeleteFirst(A: TDataType): Boolean;

begin

if IsEmpty then

Result := False

else begin

if Find(A) then

begin

if Current = Head then

begin

Head := Buffer[Head].Next;

Buffer[Head].Prev := 0;

OccupiedCells[Current] := False;

Dec(NumberOfElements)

end

else if Current = Tail then

begin

Tail := Buffer[Tail].Prev;

Buffer[Tail].Next := 0;

OccupiedCells[Current] := False;

Dec(NumberOfElements)

end

else begin

Buffer[Buffer[Current].Next].Prev := Buffer[Buffer[Current].Prev].Next;

Buffer[Buffer[Current].Prev].Next := Buffer[Buffer[Current].Next].Prev;

OccupiedCells[Current] := False;

Dec(NumberOfElements)

end;

Result := True

end

else

Result := False

end

end;

destructor TSerialList.Destroy;

begin

Create

end;

procedure TSerialList.ExchangeSort;

var

I, J: TIndex;

T: TElement;

begin

GarbageCollector;

NOC := 0;

for I := GetNOE downto 1 do

for J := 1 to GetNOE - 1 do

begin

Inc(NOC);

if Buffer[J].Data > Buffer[J + 1].Data then

begin

Inc(NOC);

T := Buffer[J];

Buffer[J] := Buffer[J + 1];

Buffer[J + 1] := T

end

end;

Head := 1;

Tail := GetNOE;

Current := 1;

while Current < GetNOE do

begin

Buffer[Current].Next := Current + 1;

Buffer[Current].Prev := Current - 1;

Inc(Current)

end;

Buffer[GetNOE].Next := 0;

Buffer[GetNOE].Prev := GetNOE - 1

end;

function TSerialList.Find(A: TDataType): Boolean;

begin

Current := Head;

while (Buffer[Current].Data <> A) and (Current <> 0) do

Current := Buffer[Current].Next;

Result := Buffer[Current].Data = A

end;

procedure TSerialList.GarbageCollector;

var

Sorted: TIndex;

Temp: TElement;

begin

Current := 1;

Sorted := NOE;

repeat

while OccupiedCells[Current] do

Inc(Current);

while not OccupiedCells[Sorted] do

Dec(Sorted);

if Current < Sorted then

begin

Buffer[Buffer[Current].Next].Prev := Sorted;

Buffer[Buffer[Current].Prev].Next := Sorted;

Temp := Buffer[Current];

Buffer[Current] := Buffer[Sorted];

Buffer[Sorted] := Temp;

OccupiedCells[Current] := True;

OccupiedCells[Sorted] := False

end

until Current > Sorted;

end;

function TSerialList.GetNOC: Integer;

begin

Result := NOC

end;

function TSerialList.GetNOE: TIndex;

begin

Result := NumberOfElements

end;

function TSerialList.IsEmpty: Boolean;

begin

Result := NumberOfElements = 0

end;

function TSerialList.IsFull: Boolean;

begin

Result := NumberOfElements = NOE

end;

procedure TSerialList.QuickSort;

procedure RQuickSort(iLo, iHi: TIndex);

var

Lo, Hi: TIndex;

T: TElement;

Mid: TDataType;

begin

Lo := iLo;

Hi := iHi;

Mid := Buffer[(Lo + Hi) div 2].Data;

repeat

Inc(NOC);

while Buffer[Lo].Data < Mid do

Inc(Lo);

while Buffer[Hi].Data > Mid do

Dec(Hi);

if Lo <= Hi then

begin

T := Buffer[Lo];

Buffer[Lo] := Buffer[Hi];

Buffer[Hi] := T;

Inc(Lo);

Dec(Hi)

end

until Lo > Hi;

if Hi > iLo then

RQuickSort(iLo, Hi);

if Lo < iHi then

RQuickSort(Lo, iHi)

end;

begin

GarbageCollector;

NOC := 0;

RQuickSort(1, GetNOE);

Head := 1;

Tail := GetNOE;

Current := 1;

while Current < GetNOE do

begin

Buffer[Current].Next := Current + 1;

Buffer[Current].Prev := Current - 1;

Inc(Current)

end;

Buffer[GetNOE].Next := 0;

Buffer[GetNOE].Prev := GetNOE - 1

end;

function TSerialList.Read: TOutputArray;

begin

GarbageCollector;

SetLength(Result, GetNOE + 1);

Current := Head;

while Current <> 0 do

begin

Result[Current - 1] := Buffer[Current].Data;

Current := Buffer[Current].Next

end

end;

procedure TSerialList.SelectiveSort;

var

Sorted: TIndex;

Temp: TElement;

begin

GarbageCollector;

Current := 1;

NOC := 0;

while Current < GetNOE do

begin

Sorted := GetNOE;

Inc(NOC);

while Sorted >= Current + 1 do

begin

if Buffer[Current].Data > Buffer[Sorted].Data then

begin

Inc(NOC);

Temp := Buffer[Current];

Buffer[Current] := Buffer[Sorted];

Buffer[Sorted] := Temp

end;

Dec(Sorted)

end;

Inc(Current)

end;

Head := 1;

Tail := GetNOE;

Current := 1;

while Current < GetNOE do

begin

Buffer[Current].Next := Current + 1;

Buffer[Current].Prev := Current - 1;

Inc(Current)

end;

Buffer[GetNOE].Next := 0;

Buffer[GetNOE].Prev := GetNOE - 1

end;

end.

Анализ результатов

В ходе тестирования были получены следующие результаты:

Список не упорядочен

Количество элементов в списке

5

20

35

50

65

80

95

110

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

7

63

290

268

413

617

792

1117

Сортировка обменами

27

476

1494

3102

5275

7893

11235

14875

Быстрая сортировка

5

27

59

91

127

162

193

237

Список упорядочен по неубыванию

Количество элементов в списке

5

20

35

50

65

80

95

110

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

4

19

34

49

64

79

94

109

Сортировка обменами

20

380

1190

2450

4160

6320

8930

11990

Быстрая сортировка

3

12

19

31

33

48

63

63

Список упорядочен по невозрастанию

Количество элементов в списке

5

20

35

50

65

80

95

110

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

6

29

51

74

96

119

141

164

Сортировка обменами

30

570

1785

3675

6240

9480

13395

17985

Быстрая сортировка

5

22

36

55

65

88

110

117

Выводы

Анализируя результаты исследований, можно сделать вывод о том, что в независимости от того на чём сортировки реализованы, результаты получаются одни и те же: быстрая сортировка (Хоара) -- самая быстрая из сортировок, у которой логарифмическая характеристика, а не линейная, что, кстати, видно из графиков.

Список использованной литературы

1. В. Г. Синюк. Лекции по структурам данных.

2. К. Пачеко, С. Тейксейра. Delphi 5. Руководство разработчика. Т. 1, 2.

Размещено на Allbest.ru


Подобные документы

  • Приобретение навыков работы со списками в программах на Visual Prolog. Изображение списка в виде головы и хвоста. Удаление всех вхождений элемента в списке. Обозначение пустого списка. Вычисление суммы элементов, стоящих в списке на нечетных местах.

    лабораторная работа [94,9 K], добавлен 27.11.2014

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

    курсовая работа [165,4 K], добавлен 24.06.2012

  • Алгоритмы сортировки методами простых вставок и пузырька. Зависимость среднего времени сортировки от числа сортируемых элементов. Функции, осуществляющие сортировку любого количества элементов методом простых вставок, на основе сортировки таблицы адресов.

    курсовая работа [557,1 K], добавлен 26.05.2010

  • Определение понятия, видов и задач сортировки. Рассмотрение основ построения простых и улучшенных алгоритмов сортировки, анализ числа операций. Линейная и пирамидальная организация данных. Основные правила нижней оценки числа операций в алгоритмах.

    презентация [274,5 K], добавлен 19.10.2014

  • Обработка массивов элементов любого типа как главное назначение алгоритмов сортировки. Анализ наиболее используемых алгоритмов сортировки: пузырьком, выбором, вставками, методом Шелла и быстрой сортировкой. Основные требования к алгоритмам сортировки.

    реферат [189,8 K], добавлен 06.12.2014

  • Исследование основных особенностей алгоритмов быстрой и поразрядной сортировки данных. Построение графиков зависимости времени сортировки от количества элементов в файле и от степени перемешенности элементов. Описания сортировки чисел и строковых данных.

    лабораторная работа [1,2 M], добавлен 23.07.2012

  • Общие сведения о Microsoft Excel. Формирование таблицы продаж в виде списка. Создание формы для ввода информации командой Данные-Форма. Выполнение сортировки, фильтрации данных в списке. Формирование промежуточных итогов по ежемесячной прибыли.

    курсовая работа [23,5 K], добавлен 16.12.2010

  • Реализация различных методов сортировки. Алгоритмические языки программирования. Обработка большого числа единообразно организованных данных. Алгоритмы сортировки массивов. Анализ проблем реализации и использования различных видов сортировок массивов.

    курсовая работа [640,3 K], добавлен 07.07.2011

  • Постановка задачи сортировки. Анализ основных понятий сортировок слияниями. Алгоритм сортировки простым и естественным слиянием. Оценка сложности алгоритма. Программная реализация простого слияния. Тестирование меню на корректность входных данных.

    курсовая работа [283,6 K], добавлен 22.06.2015

  • Факторизация натурального числа. Метод квадратичного решета. Факторизация с помощью эллиптических кривых. Реализация алгоритмов натуральных чисел и оценка их эффективности. Применение алгоритмов факторизации натуральных чисел в программной среде Maple.

    курсовая работа [851,6 K], добавлен 25.06.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.