1717 * @see <a href="https://en.wikipedia.org/wiki/Smoothsort">Wikipedia: Smoothsort</a>
1818 */
1919public 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