Skip to content

Commit 593acfd

Browse files
committed
optimize lithiumsort
1 parent e82cd95 commit 593acfd

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

SortingVisualizer.opal

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ new float UNIT_SAMPLE_DURATION = 1.0 / 30.0,
1515
N_OVER_R = NATIVE_FRAMERATE / RENDER_FRAMERATE,
1616
R_OVER_N = RENDER_FRAMERATE / NATIVE_FRAMERATE;
1717

18-
new str VERSION = "2024.4.29";
18+
new str VERSION = "2024.5.4";
1919

2020
import math, random, time, os, numpy, sys,
2121
pygame_gui, json, subprocess, shutil,

sorts/LithiumSort.opal

+48-9
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,54 @@ new class LithiumSort {
5959
MAX_STRAT4_UNIQUE = 8,
6060
SMALL_MERGE = 16;
6161

62-
new method __init__(rot = None) {
63-
if rot is None {
64-
this.rotate = sortingVisualizer.getRotation(
65-
id = sortingVisualizer.getUserSelection(
66-
[r.name for r in sortingVisualizer.rotations],
67-
"Select rotation algorithm (default: Helium)"
68-
)
69-
).indexedFn;
62+
new method __init__() {
63+
this.bufLen = 0;
64+
}
65+
66+
new method rotate(array, a, m, b) {
67+
new int rl = b - m,
68+
ll = m - a,
69+
bl = this.bufLen,
70+
min_ = bl if rl != ll && min(bl, rl, ll) > LithiumSort.SMALL_MERGE else 1;
71+
72+
while ll > min_ and rl > min_ {
73+
if rl < ll {
74+
blockSwap(array, a, m, rl);
75+
a += rl;
76+
ll -= rl;
77+
} else {
78+
b -= ll;
79+
rl -= ll;
80+
backwardBlockSwap(array, a, b, ll);
81+
}
82+
}
83+
84+
if rl == 1 {
85+
insertToLeft(array, m, a);
86+
} elif ll == 1 {
87+
insertToRight(array, a, b - 1);
88+
}
89+
90+
if min == 1 || rl <= 1 || ll <= 1 {
91+
return;
92+
}
93+
94+
if rl < ll {
95+
backwardBlockSwap(array, m, this.bufPos, rl);
96+
97+
for i = m + rl - 1; i >= a + rl; i-- {
98+
array[i].swap(array[i - rl]);
99+
}
100+
101+
backwardBlockSwap(array, this.bufPos, a, rl);
70102
} else {
71-
this.rotate = sortingVisualizer.getRotation(name = rot).indexedFn;
103+
blockSwap(array, a, this.bufPos, ll);
104+
105+
for i = a; i < b - ll; i++ {
106+
array[i].swap(array[i + ll]);
107+
}
108+
109+
blockSwap(array, this.bufPos, b - ll, ll);
72110
}
73111
}
74112

@@ -664,6 +702,7 @@ new class LithiumSort {
664702

665703
this.firstMerge(array, a, a + r, b, strat3);
666704

705+
this.bufLen = 0;
667706
binaryInsertionSort(array, b, e);
668707

669708
r = lrBinarySearch(array, a, b, array[e - 1], False);

threads/runAllSorts.opal

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ runAllSort(2048, "Helium Sort", 3, 0);
162162
runAllSort(1024, "Hydrogen Sort", 2);
163163
runAllSort(2048, "Kota Sort", 7, rotations.index("Cycle Reverse"));
164164
runAllSort(1024, "Ecta Sort", 3);
165-
runAllSort(2048, "Lithium Sort", 4, rotations.index("Helium"));
165+
runAllSort(2048, "Lithium Sort", 4);
166166

167167

168168
ct = "Partition Sorts";

0 commit comments

Comments
 (0)