9
9
/// largest remaining element
10
10
/// This algorithm makes use of Leonardo numbers. It's a sequence of numbers
11
11
/// defined by:
12
- /// ```no_run
12
+ /// ```ignore
13
13
/// L(0) = 1
14
14
/// L(1) = 1
15
15
/// L(n) = L(n - 1) + L(n - 2) + 1
32
32
/// sorting_rs::smooth_sort(&mut strings);
33
33
/// assert_eq!(strings, &["cargo", "rustc", "rustup"]);
34
34
/// ```
35
- use std:: fmt:: Debug ;
36
35
37
36
const LEO_NUMS : [ usize ; 90 ] = [
38
37
1 , 1 , 3 , 5 , 9 , 15 , 25 , 41 , 67 , 109 , 177 , 287 , 465 , 753 , 1219 , 1973 , 3193 ,
@@ -53,11 +52,11 @@ const LEO_NUMS: [usize; 90] = [
53
52
3559958832009428377 , 5760134388741632239 ,
54
53
] ;
55
54
56
- pub fn smooth_sort < T : PartialOrd + Debug > ( input : & mut [ T ] )
55
+ pub fn smooth_sort < T : PartialOrd > ( input : & mut [ T ] )
57
56
{
58
57
if input. len ( ) < 2 { return ; }
59
58
60
- // Init addtitional heap
59
+ // Init addtitional index heap
61
60
let input = input;
62
61
let in_len = input. len ( ) ;
63
62
let mut heap = Vec :: < usize > :: new ( ) ;
@@ -67,16 +66,13 @@ pub fn smooth_sort<T: PartialOrd + Debug>(input: &mut [T])
67
66
heap. pop ( ) ;
68
67
let len_leo = heap. len ( ) ;
69
68
heap[ len_leo - 1 ] += 1 ;
69
+ } else if heap. len ( ) >= 1 && heap[ heap. len ( ) - 1 ] == 1 {
70
+ heap. push ( 0 ) ;
70
71
} else {
71
- if heap. len ( ) >= 1 && heap[ heap. len ( ) - 1 ] == 1 {
72
- heap. push ( 0 ) ;
73
- } else {
74
- heap. push ( 1 ) ;
75
- }
72
+ heap. push ( 1 ) ;
76
73
}
77
74
restore_heap ( input, i, & heap) ;
78
75
}
79
- println ! ( "DEBUG: {:?}" , input) ;
80
76
81
77
for i in ( 0 ..in_len) . rev ( ) {
82
78
if heap[ heap. len ( ) - 1 ] < 2 {
@@ -92,7 +88,6 @@ pub fn smooth_sort<T: PartialOrd + Debug>(input: &mut [T])
92
88
restore_heap ( input, t[ 0 ] , & heap) ;
93
89
}
94
90
}
95
- println ! ( "DEBUG: {:?}" , input) ;
96
91
}
97
92
98
93
fn restore_heap < T : PartialOrd > ( input : & mut [ T ] , index : usize , heap : & Vec < usize > )
@@ -104,8 +99,8 @@ fn restore_heap<T: PartialOrd>(input: &mut [T], index: usize, heap: &Vec<usize>)
104
99
105
100
while current > 0 {
106
101
let j = i - LEO_NUMS [ k] ;
107
- if input[ j] > input[ i] && ( k < 2 || input [ j ] > input [ i - 1 ] &&
108
- input[ j] > input[ i - 2 ] ) {
102
+ if input[ j] > input[ i] &&
103
+ ( k < 2 || input [ j ] > input [ i - 1 ] && input[ j] > input[ i - 2 ] ) {
109
104
input. swap ( i, j) ;
110
105
i = j;
111
106
current -= 1 ;
@@ -114,7 +109,8 @@ fn restore_heap<T: PartialOrd>(input: &mut [T], index: usize, heap: &Vec<usize>)
114
109
break ;
115
110
}
116
111
}
117
- while k > 2 {
112
+
113
+ while k >= 2 {
118
114
let t = get_child_trees ( i, k) ;
119
115
// tr kr tl kl
120
116
// 0 1 2 3
@@ -153,6 +149,12 @@ mod tests {
153
149
debug_assert_eq ! ( vector_in, & [ 10 , 11 , 13 , 20 ] ) ;
154
150
}
155
151
#[ test]
152
+ fn test_smooth_01 ( ) {
153
+ let mut vector_in = vec ! [ 20 , 10 , 11 , 13 , 24 , 9 , 2 , 1 , 8 ] ;
154
+ smooth_sort ( & mut vector_in) ;
155
+ debug_assert_eq ! ( vector_in, & [ 1 , 2 , 8 , 9 , 10 , 11 , 13 , 20 , 24 ] ) ;
156
+ }
157
+ #[ test]
156
158
fn test_smooth_empty ( ) {
157
159
let mut vector_in: Vec < i32 > = vec ! [ ] ;
158
160
smooth_sort ( & mut vector_in) ;
0 commit comments