@@ -59,16 +59,54 @@ new class LithiumSort {
59
59
MAX_STRAT4_UNIQUE = 8 ,
60
60
SMALL_MERGE = 16 ;
61
61
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);
70
102
} 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);
72
110
}
73
111
}
74
112
@@ -664,6 +702,7 @@ new class LithiumSort {
664
702
665
703
this.firstMerge(array, a, a + r, b, strat3);
666
704
705
+ this.bufLen = 0 ;
667
706
binaryInsertionSort(array, b, e);
668
707
669
708
r = lrBinarySearch(array, a, b, array[e - 1 ], False);
0 commit comments