Skip to content

Commit 150037f

Browse files
committed
fix: Final correction for smoothsort
1 parent 8412268 commit 150037f

File tree

1 file changed

+27
-67
lines changed

1 file changed

+27
-67
lines changed

src/main/java/com/thealgorithms/sorts/SmoothSort.java

Lines changed: 27 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -17,58 +17,16 @@
1717
* @see <a href="https://en.wikipedia.org/wiki/Smoothsort">Wikipedia: Smoothsort</a>
1818
*/
1919
public final class SmoothSort {
20+
// clang-format off
2021

2122
/**
2223
* Private constructor to prevent instantiation of this utility class.
2324
*/
24-
private SmoothSort() {
25-
}
25+
private SmoothSort() {}
2626

2727
// Leonardo numbers: L(0)=1, L(1)=1, L(k)=L(k-1)+L(k-2)+1
2828
private static final int[] LP = {
29-
1,
30-
1,
31-
3,
32-
5,
33-
9,
34-
15,
35-
25,
36-
41,
37-
67,
38-
109,
39-
177,
40-
287,
41-
465,
42-
753,
43-
1219,
44-
1973,
45-
3193,
46-
5167,
47-
8361,
48-
13529,
49-
21891,
50-
35421,
51-
57313,
52-
92735,
53-
150049,
54-
242785,
55-
392835,
56-
635621,
57-
1028457,
58-
1664079,
59-
2692537,
60-
4356617,
61-
7049155,
62-
11405773,
63-
18454929,
64-
29860703,
65-
48315633,
66-
78176337,
67-
126491971,
68-
204668309,
69-
331160281,
70-
535828591,
71-
866988873,
29+
1, 1, 3, 5, 9, 15, 25, 41, 67, 109, 177, 287, 465, 753, 1219, 1973, 3193, 5167, 8361, 13529, 21891, 35421, 57313, 92735, 150049, 242785, 392835, 635621, 1028457, 1664079, 2692537, 4356617, 7049155, 11405773, 18454929, 29860703, 48315633, 78176337, 126491971, 204668309, 331160281, 535828591, 866988873,
7230
};
7331

7432
/**
@@ -82,11 +40,11 @@ public static <T extends Comparable<T>> void sort(T[] arr) {
8240
return;
8341
}
8442
int n = arr.length;
43+
44+
int q = 0; // The order of the rightmost heap
45+
long p = 1; // A bitmask representing the sizes of the heaps
8546
int head = 0; // The head of the list to be sorted
86-
long p = 1; // A bitmask representing the sizes of the heaps.
87-
int q = 1; // Size of the rightmost heap
8847

89-
// Phase 1: Build the forest of heaps
9048
while (head < n) {
9149
if ((p & 3) == 3) {
9250
// Combine the last two heaps
@@ -96,7 +54,6 @@ public static <T extends Comparable<T>> void sort(T[] arr) {
9654
p >>>= 1;
9755
q = 1;
9856
}
99-
10057
p |= 1L << q;
10158

10259
while (head + LP[q] > n) {
@@ -107,7 +64,6 @@ public static <T extends Comparable<T>> void sort(T[] arr) {
10764
trinkle(arr, head - 1, p, q);
10865
}
10966

110-
// Phase 2: Deconstruct the forest to sort the array
11167
for (head = n - 1; head > 0; head--) {
11268
if (q <= 1) {
11369
p >>>= q;
@@ -123,6 +79,24 @@ public static <T extends Comparable<T>> void sort(T[] arr) {
12379
}
12480
}
12581

82+
private static <T extends Comparable<T>> void trinkle(T[] arr, int head, long p, int q) {
83+
while (q > 0) {
84+
p &= ~(1L << q);
85+
int prevHeapOrder = Long.numberOfTrailingZeros(p) + 1;
86+
87+
if (prevHeapOrder > 0) {
88+
int parent = head - LP[q];
89+
if (arr[parent].compareTo(arr[head]) >= 0) {
90+
break;
91+
}
92+
swap(arr, head, parent);
93+
head = parent;
94+
}
95+
q = prevHeapOrder;
96+
}
97+
sift(arr, head, q);
98+
}
99+
126100
private static <T extends Comparable<T>> void sift(T[] arr, int head, int order) {
127101
while (order >= 2) {
128102
int rightChild = head - 1;
@@ -131,6 +105,7 @@ private static <T extends Comparable<T>> void sift(T[] arr, int head, int order)
131105
if (arr[head].compareTo(arr[leftChild]) >= 0 && arr[head].compareTo(arr[rightChild]) >= 0) {
132106
break;
133107
}
108+
134109
if (arr[leftChild].compareTo(arr[rightChild]) > 0) {
135110
swap(arr, head, leftChild);
136111
head = leftChild;
@@ -143,26 +118,11 @@ private static <T extends Comparable<T>> void sift(T[] arr, int head, int order)
143118
}
144119
}
145120

146-
private static <T extends Comparable<T>> void trinkle(T[] arr, int head, long p, int q) {
147-
while (q > 0) {
148-
p &= ~(1L << q);
149-
int prevHeapOrder = Long.numberOfTrailingZeros(p) + 1;
150-
if (prevHeapOrder > 0) {
151-
int parent = head - LP[q];
152-
if (arr[parent].compareTo(arr[head]) >= 0) {
153-
break;
154-
}
155-
swap(arr, head, parent);
156-
head = parent;
157-
}
158-
q = prevHeapOrder;
159-
}
160-
sift(arr, head, q);
161-
}
162-
163121
private static <T> void swap(T[] arr, int i, int j) {
164122
T temp = arr[i];
165123
arr[i] = arr[j];
166124
arr[j] = temp;
167125
}
126+
127+
// clang-format on
168128
}

0 commit comments

Comments
 (0)