Русская сортировка половинами: человеческая сортировка быстрее в 4 раза и МЫ

Цель: заинтересовать народ созданием программы Русская сортировка половинами
на других любых языках программирования
Особенность программы для ЭВМ «Русская сортировка половинами»:
уникальная картина сортировки и ускорение алгоритмов сортировки.

image

Допустим требуется сортировать массив N=11 чисел,
в том числе являющийся частью ранее частично сортированного большего массива.

Массив d(1,1...N)

2 8 1 6 7 10 4 11 9 3 5

Среднее значение: 7 как сумма данных ячеек делить на число ячеек

2 8 1 6 7 10 4 11 9 3 5   Исходный массив d(1,1...N)
                        Предыдущих ячеек: 0
2                       2 < 7 в начало счётчик = 1
2                   8   8 >= 7 в конец счётчик = 1
2 1                 8   1 < 7 в начало счётчик = 2
2 1 6               8   6 < 7 в начало счётчик = 3
2 1 6             7 8   7 >= 7 в конец счётчик = 3
2 1 6           10 7 8   10 >= 7 в конец счётчик = 3
2 1 6 4         10 7 8   4 < 7 в начало счётчик = 4
2 1 6 4       11 10 7 8   11>= 7 в конец счётчик = 4
2 1 6 4     9 11 10 7 8   9 >= 7 в конец счётчик = 4
2 1 6 4 3   9 11 10 7 8   3 < 7 в начало счётчик = 5
2 1 6 4 3 5 9 11 10 7 8   5 < 7 в начало счётчик = 6

Массив d(2,1...N) и счётчик = 6
2 1 6 4 3 5 9 11 10 7 8

Любая из левых 6 ячеек меньше, чем любая из правых 5 ячеек.
Массив d(2,1...N) условно делится на 2 части:
2 1 6 4 3 5   и   9 11 10 7 8

и ячейки проходят ещё циклы независимо друг от друга,
сохраняя непрерывность массива d(2,1...N) ,

однако даже в данном виде после 1-го цикла
ускоряется работа человеческих алгоритмов сортировки
временной сложности N^2 в 2 раза


и после 2-го цикла ускоряется работа человеческих алгоритмов сортировки
временной сложности N^2 в 4 раза.

Тестирование на одинаковых массивах


Сортировка Пузырьковая (bubble): сравниваются элементы без смен равных.
Сортировка Выбором (select): нахождение минимума и смена с текущим элементом.

Русская сортировка половинами: проверка ускорения сортировок пузырьковой или выбором, используя деление исходного массива на 2 части, включает переменные без индекса или цикл: улучшенная пузырьковая, где массив делится на 2 части и также улучшается сортировка выбором и другие человечески понятные сортировки и возможно делить массив на 4 части и на 8 частей массово понимая алгоритм.



Сравнение формул для оценки максимального ускорения других сортировок

русская
сортировка
2 части
смены =x*(N/x)*((N/x)-1)/2 N=8 x=2 =2*4*3/2 12 N=100 2450
пузырьковая bubble смены =N*(N-1)/2 N=8 =8*7/2 28 N=100 4950
русская
сортировка
4 части
смены =x*(N/x)*((N/x)-1)/2 N=8 x=4 =4*2*1/2 4 N=100 1200




100ооо шт.   
русскаясортировка 4 части 70 секунд
русскаясортировка 2 части 170 секунд
пузырьковая bubble 230 секунд
выбором select 140 секунд
русская сортировка выбором 2 части 105 секунд
русскаясортировка выбором 4 части 67 секунд

1000 шт.  
русскаясортировка 4 части циклы  135048 смены  39725
русскаясортировка 2 части циклы   261342 смены   92805
пузырьковая bubble циклы   499500  смены   227585
выбором select циклы      999 смены      6346
русскаясортировка выбором 2 части циклы      999 смены     4406
русскаясортировка выбором 4 части циклы      999 смены    3811

10000 шт. 
русскаясортировка выбором 4 части циклы 10000 смены 48736
русскаясортировка выбором 2 части циклы 10000 смены 67704
выбором select циклы 10000 смены 97888


текстовые строки
русскаясортировка 2 части 1000 строк циклы 264280 смен 137131
пузырьковая bubble 1000 строк циклы 499500 смены 264139
русскаясортировка 2 части 100ооо строк 390 секунд
пузырьковая bubble 100ооо строк 650 секунд

Во всех тестах специально формировался массив,
где Русская сортировка половинами теоретически работает наиболее медленно

и всё одно Русская сортировка половинами ускоряет другие сортировки
за счёт перехода формулы затрат времени N^2
в формулу например для 2-х частей: 2*(N/2)*((N/2)-1)/2.
 

Русская сортировка половинами требует данные:
c:/N.txt = только количество элементов и
c:/ISX.txt = элементы в столбец в требующемся количестве возможно создать в excel
=случмежду(1000;100000)
и скопировав вставить в текст ISX.txt


QB64: Русская сортировка половинами

'RUSSIAN sort halves
OPEN "c:/N.txt" FOR INPUT AS #5
INPUT #5, n
DIM d(3, n), sum(3, 4), sred(3, 4), y(3, 2),q(5)


OPEN "c:/ISX.txt" FOR INPUT AS #1
FOR i=1 TO n: INPUT #1, d(1, i): NEXT


IF n < 17 THEN FOR k=1 TO n: PRINT d(1, k);: NEXT: PRINT
IF n > 16 THEN FOR k=n-10 TO n: PRINT d(1, k);: NEXT: PRINT


start=TIMER: p=0: s=0
m=1: q=1


' 1-u PROXOD
FOR i=1 TO n: sum(m,q)=sum(m,q)+d(m,i): NEXT
sred(m,q)=sum(m,q) / n


y(m,q)=1: z=0: FOR i=1 TO n
IF d(m,i) < sred(m,q) THEN d(m+1, y(m,q))=d(m,i): y(m,q)=y(m,q)+1: ELSE d(m+1, n-z)=d(m,i): z=z+1
NEXT


y(m,q)=y(m,q)-1
m=m+1: q=q * 2


FOR i=1 TO n: sum(m,1)=sum(m,1)+d(m,i): NEXT
sred(m,1)=sum(m,1) / n


IF n < 17 THEN FOR k=1 TO n: PRINT d(m,k);: NEXT: PRINT: PRINT y(m-1,1), sred(m-1,1): PRINT
IF n > 16 THEN FOR k=n-10 TO n: PRINT d(m,k);: NEXT: PRINT: PRINT y(m-1,1), sred(m-1,1): PRINT


' BKL NOMER MENSHE SRED 1
' KONEZ 1-GO


'DELIM 1-e iz 2-x


sum(m,q-1)=0


FOR i=1 TO y(m-1,q-1): sum(m,q-1)=sum(m,q-1)+d(m,i): NEXT
sred(m,q-1)=sum(m,q-1) / (y(m-1,q-1))


y(m,q-1)=1: z=0


FOR i=1 TO y(m-1,q-1)
IF d(m,i) < sred(m,q-1) THEN: d(m+1, y(m,q-1))=d(m,i): y(m,q-1)=y(m,q-1)+1 ELSE d(m+1, y(m-1,q-1)-z)=d(m,i): z=z+1
IF n < 17 THEN FOR k=1 TO y(m-1,q-1): PRINT d(m,k);: NEXT: PRINT "*";: FOR k=1 TO y(m-1,q-1): PRINT d(m+1, k);: NEXT: PRINT
NEXT


'DELIM 2-e iz 2-x


sum(m,q)=0
FOR i=y(m-1,q-1)+1 TO n: sum(m,q)=sum(m,q)+d(m,i): NEXT:
sred(m,q)=sum(m,q) / (n-y(m-1,q-1)):
PRINT: PRINT sum(m,q), sred(m,q), (n-y(m-1,q-1)),


'DALEE


y(m,q)=y(m-1,q-1)+1: z=0
PRINT "ot"; y(m-1,q-1)+1; "do "; n


FOR i=y(m-1,q-1)+1 TO n
IF d(m,i) < sred(m,q) THEN d(m+1, y(m,q))=d(m,i): y(m,q)=y(m,q)+1 ELSE d(m+1, n-z)=d(m,i): z=z+1
IF n < 17 THEN FOR k=y(m-1,q-1)+1 TO n: PRINT d(m,k);: NEXT: PRINT "=";: FOR k=y(m-1,q-1)+1 TO n: PRINT d(m+1, k);: NEXT: PRINT
NEXT


y(m,q)=y(m,q)-1


' SORTIROVKA
'to4ki kontrol 1 21 11 22 n


q(1)=2
q(2)=y(m,q-1) '2 1
q(3)=y(m-1,q-1) '1 1
q(4)=y(m,q) '2 2
q(5)=n


PRINT m
PRINT "2="; q(2); m; q-1,
PRINT "3="; q(3); m-1; q-1,
PRINT "4="; q(4); m; q
PRINT


m=m+1


FOR t=1 TO 4
FOR i=q(t)-1 TO q(t+1): FOR j=i+1 TO q(t+1)
IF d(m,i) > d(m,j) THEN SWAP d(m,i), d(m,j): p=p+1
s=s+1: NEXT: 'FOR k=1 TO n: PRINT d(m,k);: NEXT: PRINT: PRINT m
NEXT
NEXT


finish=TIMER


IF n < 17 THEN FOR k=1 TO n: PRINT d(m,k);: NEXT: PRINT: PRINT y(m-1, 1), sred(m-1, 1): PRINT
IF n > 16 THEN FOR k=n-10 TO n: PRINT d(m,k);: NEXT: PRINT: PRINT y(m-1, 1), sred(m-1, 1): PRINT
'FOR k=1 TO n: PRINT d(m,k);: NEXT: PRINT
PRINT finish-start, s, p


OPEN "c:/=sortda444bubble.txt" FOR OUTPUT AS #2
PRINT #2, finish-start; "секунд ", "циклы "; s, "смены "; p
PRINT #2, n; "шт.", "русская сортировка 4 части цикл массив"
FOR i=1 TO n: PRINT #2, d(m,i): NEXT
END


Цель: заинтересовать народ созданием программы Русская сортировка половинами
на других любых языках программирования

Комментарии (0)