Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

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

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Сортировка включениями




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

(См. Пример 3.)

Сортировка бинарными включениями

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

(См. Пример 4.)

Шейкер-сортировка

(См. Пример 5.)

ДЕМОНСТРАЦИОННЫЕ ПРИМЕРЫ

Пример 1

' Имя файла Sort_Bubble.vbs

' Программа демонстрирует сортировку вектора по неубыванию методом обмена

' или (другое название) пузырьком.

 

Option Explicit

Dim sorted, i, j, s, B, x

B=Array (5, 3, 2, 1, 0, -1) ' вектор, который должен быть отсортирован пузырьком

sorted=false ' логическая переменная

While not sorted ' пока вектор не отсортирован...

sorted=true

For i=0 to 4

If B(i+1)<B(i) Then ' если левый элемент больше правого, то поменять их местами

x=B(i)

B(i)=B(i+1)

B(i+1)=x

For j=0 to 5 ' в переменную s записывается изменённый вектор

s=s&B(j)&" "

Next

s=s&VbCrLf

Sorted=false

End If

Next

Wend

 

MsgBox "Задача:"&vbCrLf&_

"Отсортировать вектор (5, 3, 2, 1, 0, -1)"&vbCrLf&vbCrLf&_

"Пошаговая сортировка:"&vbCrLf&_

s&vbCrLf,vbInformation, "Сортировка пузырьком:"

Пример 2

' Имя файла Sort_Choice.vbs

' Программа демонстрирует сортировку вектора по неубыванию методом простого

' выбора (первый способ).

 

Option Explicit

Dim i, j, s, B, x, k, m

B=Array (5, 3, 2, 1, 0, -1) ' вектор, который должен быть отсортирован

 

' Начало алгоритма сортировки

For i=0 to 4

k=i: x=B(i)

For j=i+1 to 5

If B(j)<x Then

k=j

x=B(j)

End If

B(k)=B(i)

B(i)=x

For m=0 to 5

s=s&B(m)&" " ' в переменную s записывается изменённый вектор

Next

s=s&VbCrLf

Next

Next

' Конец алгоритма сортировки

 

MsgBox "Задача:"&vbCrLf&_

"Отсортировать вектор (5, 3, 2, 1, 0, -1)"&vbCrLf&vbCrLf&_

"Пошаговая сортировка:"&vbCrLf&_

s&vbCrLf,vbInformation, "Сортировка простым выбором (1 сп):"

Пример 3

' Имя файла Sort_Insert.vbs

' Программа демонстрирует сортировку вектора по неубыванию методом простых

' включений.

 

Option Explicit

Dim i, j, s, x, k, m

Dim B (6) ' вектор, который должен быть отсортирован

B(1)=5

B(2)=3

B(3)=10

B(4)=1

B(5)=0

B(6)=-1

 

' Начало алгоритма сортировки

For i=1 to 6

x=B(i): B(0)=x: j=i-1

While x<B(j)

B(j+1)=B(j): j=j-1

Wend

B(j+1)=x

For m=0 to 6

s=s&B(m)&" " ' в переменную s записывается изменённый вектор

Next

s=s&VbCrLf

Next

' Конец алгоритма сортировки

 

MsgBox "Задача:"&vbCrLf&_

"Отсортировать вектор (5, 3, 10, 1, 0, -1)"&vbCrLf&vbCrLf&_

"Пошаговая сортировка:"&vbCrLf&_

s&vbCrLf,vbInformation, "Сортировка простыми включениями:"

Пример 4

' Имя файла Sort_Bin_Insert.vbs

' Программа демонстрирует сортировку бинарными включениями

 

Option Explicit

const N=8

dim Arr()

redim Arr(N) 'наш массив

dim i 'счетчик

randomize

For i=1 To N

arr(i)=Cint(10*rnd(1))

next

dim s

s=""

For i=1 To N

s=s+CStr(i)+" --> "+Cstr(arr(i))+";"+vbcrlf

next

dim x,j,l,r,m

' Начало алгоритма сортировки

For i=2 to N

x=Cint(arr(i)): l=1: r=Cint(i-1)

While Cint(l)<=Cint(r)

m=Cint(l+r)\2

if CInt(x)<arr(m) then

r=m-1

else

l=m+1

end if

Wend

j=i-1

While Cint(j)>=Cint(l)

arr(j+1)=arr(j)

j=j-1

Wend

arr(l)=x

Next

' Окончание алгоритма сортировки

dim s1

s1=""

For i=1 To N

s1=s1+CStr(i)+" --> "+Cstr(arr(i))+";"+vbcrlf

next

msgbox "Неотсортированный массив:"&vbCrLf&_

s&vbcrlf&vbcrlf&"Отсортированный:"&vbCrLf&_

s1,0,"Сортировка бинарными включениями:"

Пример 5

' Имя файла Shake_Sort.vbs

' Программа демонстрирует Шейкер-сортировку

 

Option Explicit

const N=8

dim a()

redim a(N)

dim x,i,j,k,l,r

randomize

For i=1 To N

a(i)=Cint(10*rnd(1))

next

dim s

s=""

For i=1 To N

s=s+CStr(i)+" --> "+Cstr(a(i))+";"+vbcrlf

next

l=2: r=N: k=N

DO

j=r

While Cint(j)>=Cint(l)

If Cint(a(j-1))>Cint(a(j)) Then

x=a(j-1)

a(j-1)=a(j)

a(j)=x

k=j

End If

j=j-1

Wend

l=k+1

For j=l to r

If CInt(a(j-1))>Cint(a(j)) Then

x=a(j-1)

a(j-1)=a(j)

a(j)=x

k=j

End If

Next

r=k-1

LOOP UNTIL Cint(l)>Cint(r)

dim s1

s1=""

For i=1 To N

s1=s1+CStr(i)+" --> "+Cstr(a(i))+";"+vbcrlf

Next

MsgBox "Неотсортированный массив:"&vbCrLf&_

s&vbcrlf&vbcrlf&"Отсортированный:"&vbCrLf&_

s1,0,"Сортировка массива по Шейкеру:"

Пример 6

' Имя файла Find_1.vbs

' Линейный поиск наименьшего индекса элемента с заданным значением

' в "случайном" массиве.

Option Explicit

Dim i, s, x, Q

Const n=6

Dim B (6)

' Заполнение одномерного массива случайными числами

For i=0 to n

Randomize

B(i)=Fix(Rnd(1)*20)

s=s&B(i)&" "

Next

s=s&vbCrLf

' Начало алгоритма поиска

x=InputBox("Введите искомый элемент: ","Окно ввода:", 5)

i=0

Do

i=i+1: Q=CInt(B(i))=CInt(x)

Loop Until (Q or (i=n))

If Q Then

MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&x&" найден в массиве!"&vbCrLf&_

"Его минимальный индекс в массиве: "&i

Else MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&x&" не найден в массиве!"

End If

 

Пример 7

' Имя файла Find_2.vbs

' Линейный поиск с "барьером" наименьшего индекса элемента с заданным значением

' в "случайном" массиве.

Option Explicit

Dim i, s, x, Q

Const n=6

Dim B (6)

' Заполнение одномерного массива случайными числами

For i=0 to n-1

Randomize

B(i)=Fix(Rnd(1)*20)

s=s&B(i)&" "

Next

s=s&vbCrLf

' Начало алгоритма поиска

x=InputBox("Введите искомый элемент: ","Окно ввода:", 5)

i=-1: B(n)=x

Do

i=i+1

Loop Until CInt(B(i))=Cint(B(n))

If i<>n Then

MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&x&" найден в массиве!"&vbCrLf&_

"Его минимальный индекс в массиве: "&i

Else MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&x&" не найден в массиве!"

End If

Пример 8

' Имя файла Find_3.vbs

' Бинарный поиск индекса заданного элемента

' одномерного "случайного" числового массива, строго

' упорядоченного по возрастанию (нерекурсивный вариант).

' Число требуемых сравнений в методе бинарного поиска в среднем значительно

' меньше, чем при линейном поиске, а точнее говоря,

' не более чем логарифм n по основанию два вместо n в программе Find_2.vbs

Option Explicit

Dim i, j, s, x, Q, k

Const n=8

Dim B (8)

For i=0 to n

B(i)=CDbl(InputBox("Введите "&i&"-й элемент одномерного массива",_

"Ввод строго возрастающего вектора A:", i))

s=s&B(i)&" "

Next

s=s&vbCrLf

' Начало алгоритма поиска

x=CDbl(InputBox("Введите искомый элемент: ","Окно ввода:", 5))

i=0: Q=False: j=n

Do

k=(i+j)\2

If B(k)=x Then

Q=True

Else

If B(k)<x Then

i=k+1

Else j=k-1

End If

End If

Loop Until Q or (i>j)

If Q Then

MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&x&" найден в массиве!"&vbCrLf&_

"Его минимальный индекс в массиве: "&i

Else MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&x&" не найден в массиве!"

End If

Пример 9

' Имя файла Find_4.vbs

' Бинарный поиск индекса заданного элемента одномерного "случайного"

' числового массива, строго упорядоченного по возрастанию (рекурсивный вариант).

Option Explicit

Dim i, s, key

Const n=8

Dim B (8)

'-------------------------------------------------------------------------------------

Function Bin_Search (B, low, high, x)

Dim mid

If low>high Then

Bin_Search=0

Else

mid=(low+high)\2

If x=B(mid) Then

Bin_Search=mid

Else

If x<B(mid) Then

Bin_Search=Bin_Search (B, low, mid-1, x)

Else

Bin_Search=Bin_Search (B, mid+1, high, x)

End If

End If

End If

End Function

'-------------------------------------------------------------------------------------

' Ввод одномерного массива, отсортированного строго по возрастанию

For i=0 to n

B(i)=CDbl(InputBox("Введите "&i&"-й элемент одномерного массива",_

"Ввод строго возрастающего вектора B:", i))

s=s&B(i)&" "

Next

s=s&vbCrLf

key=CDbl(InputBox("Введите искомый элемент: ","Окно ввода:", 5))

If Bin_Search (B, 1, n, key)=0 Then

MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&key&" не найден в массиве!"

Else MsgBox "Массив: "&s&vbCrLf&_

"Элемент "&key&" найден в массиве!"&vbCrLf&_

"Его индекс в массиве: "&Bin_Search (B, 1, n, key)

End If

Пример 10

' Имя файла Mediana.vbs

' Поиск медианы в массиве.

' Реализация алгоритма Ч. Хоара.

' Медианой массива, содержащего N элементов, называется элемент, значение которого 'меньше (или равно) половины N элементов и больше (или равно) другой половины.

'Например, медианой массива 16 22 99 95 18 87 10 является 18. Задачу поиска медианы 'можно связать с сортировкой следующим образом: вначале произвести сортировку массива, 'а затем выбрать “средний элемент”. Но приведённая ниже программа позволяет найти 'медиану значительно быстрее.

 

Option Explicit

Dim i, s, k

Const n=8

Dim B (8)

'-------------------------------------------------------------------------------------

Sub Find (k)

Dim l, r, i, j, w, x

l=1: r=n

While l<r

x=B(k): i=l: j=r

Do

While B(i)<x

i=i+1

Wend

While x<B(j)

j=j-1

Wend

If i<=j Then

w=B(i): B(i)=B(j): B(j)=w: i=i+1: j=j-1

End If

Loop Until i>j

If j<k Then

l=i

End If

If k<i Then

r=j

End If

Wend

End Sub

'-------------------------------------------------------------------------------------

' Заполнение одномерного массива случайными числами

For i=0 to n

Randomize

B(i)=Fix(Rnd(1)*20)

s=s&B(i)&" "

Next

s=s&vbCrLf

k=n\2

Find (k)

MsgBox "Массив: "&s&vbCrLf&_

"Медиана данного массива: "&B(k),_

vbInformation,_

"Результат: "






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных