MCPcopy Create free account
hub / github.com/QMHTMY/RustBook / gallop

Function gallop

publication/code/chapter07/tim_sort.rs:90–136  ·  view source on GitHub ↗

跳跃式模糊查找,确定位置

(key: &i32, list: &[i32], mode: Mode)

Source from the content-addressed store, hash-verified

88
89// 跳跃式模糊查找,确定位置
90fn gallop(key: &i32, list: &[i32], mode: Mode) -> (usize, usize) {
91 let len = list.len();
92 if len == 0 {
93 return (0, 0);
94 }
95
96 match mode {
97 Mode::Forward => {
98 let mut prev_val = 0;
99 let mut next_val = 1;
100 while next_val < len {
101 if &list[next_val] < key {
102 prev_val = next_val;
103 next_val = 2 * (next_val + 1) - 1;
104 } else if &list[next_val] == key {
105 next_val += 1;
106 break;
107 } else {
108 break;
109 }
110 }
111
112 if next_val > len {
113 next_val = len;
114 }
115 (prev_val, next_val - prev_val)
116 }
117 Mode::Reverse => {
118 let mut prev_val = len;
119 let mut next_val = (prev_val + 1) / 2 - 1;
120 loop {
121 if &list[next_val] > key {
122 prev_val = next_val + 1;
123 next_val = (next_val + 1) / 2;
124 if next_val != 0 {
125 next_val -= 1;
126 } else {
127 break;
128 }
129 } else {
130 break;
131 }
132 }
133 (next_val, prev_val - next_val)
134 }
135 }
136}
137
138// A、B、C 归并排序
139fn merge_sort(list: &mut [i32], mut first_len: usize) {

Callers 2

gallop_leftFunction · 0.85
gallop_rightFunction · 0.85

Calls 1

lenMethod · 0.45

Tested by

no test coverage detected