1use std::fmt::{Debug, Display};
4pub mod priority_queue;
5const DEBUG: bool = false;
6pub fn heap_sort<T>(data: &mut [T])
7where
8 T: PartialOrd + Clone + Copy + Debug,
9{
10 let mut aux = Vec::with_capacity(data.len() + 1);
11 let count = data.len();
12 aux.push(data[0]);
13 for item in data.iter().take(count) {
14 aux.push(*item);
15 }
16 let n = count / 2;
17 for n in (1..=n).rev() {
18 sink(&mut aux, n, count);
19 }
20 if DEBUG {
21 println!("heap:{:?}", aux);
22 }
23 for n in (2..=count).rev() {
24 aux.swap(n, 1);
25 sink(&mut aux, 1, n - 1);
26 }
27 data[..count].copy_from_slice(&aux[1..(count + 1)]);
28}
29fn sink<T: PartialOrd>(data: &mut [T], k: usize, len: usize) {
30 let mut i = k;
31 while i <= len / 2 {
32 let mut j = i * 2;
33 if j < len && data[j] < data[j + 1] {
34 j += 1;
35 };
36 if data[i] < data[j] {
37 data.swap(j, i);
38 i = j;
39 } else {
40 break;
41 }
42 }
43}
44pub fn merge_sort<T: PartialOrd + Clone + Copy + Debug>(data: &mut [T]) {
46 let len = data.len();
47 let mut aux: Vec<T> = Vec::with_capacity(len);
48 let mut s = 1;
49 for item in data.iter().take(len) {
50 aux.push(*item);
51 }
52 let mut is_orgin = true;
53 while s < len {
54 let mut i = 0;
55 is_orgin = !is_orgin;
56 while i < len {
57 if is_orgin {
58 merge(data, &aux, i, i + s - 1, len.min(i + s + s) - 1);
59 } else {
60 merge(&mut aux, data, i, i + s - 1, len.min(i + s + s) - 1);
61 }
62 i += s + s;
63 }
64 if DEBUG {
65 println!("{:?}", data);
66 }
67 s += s;
68 }
69 if !is_orgin {
70 data[..len].copy_from_slice(&aux[..len]);
71 }
72}
73
74fn merge<T: PartialOrd + Clone + Copy + Debug>(
75 data: &mut [T],
76 aux: &[T],
77 lo: usize,
78 m: usize,
79 hi: usize,
80) {
81 if DEBUG {
82 println!("{},{},{}", lo, m, hi);
83 }
84 if lo >= hi {
85 return;
86 }
87 let mut i = lo;
88 let mut j = m + 1;
89 for item in data.iter_mut().take(hi + 1).skip(lo) {
90 if j > hi {
91 *item = aux[i];
92 i += 1;
93 } else if i > m || aux[j] < aux[i] {
94 *item = aux[j];
95 j += 1;
96 } else {
97 *item = aux[i];
98 i += 1;
99 }
100 }
101}
102pub fn bubble_sort(data: &mut [i32]) {
104 let mut i = 0;
105 while i < data.len() {
106 let mut j = i + 1;
107 let mut v = data[i];
108 let mut pos = i;
109 while j < data.len() {
110 if data[j] < v {
111 pos = j;
112 v = data[j];
113 }
114 j += 1;
115 }
116 data.swap(i, pos);
117 i += 1;
118 }
119}
120
121pub fn insert_sort<T>(data: &mut [T])where T :PartialOrd {
123 let mut count = 0;
124 for i in 1..data.len() {
125 for j in (1..=i).rev() {
126 if data[j] < data[j - 1] {
127 data.swap(j, j - 1);
128 count += 1;
129 } else {
130 break;
131 }
132 }
133 }
134 println!("count:{}", count);
135}
136pub fn quick_sort_for_three_direction<T>(data: &mut [T], lo: usize, hi: usize)
138where
139 T: PartialOrd + Clone + Copy + Debug + Display,
140{
141 if lo >= hi {
142 return;
143 }
144 let mut i = lo + 1;
145 let mut gt = hi;
146 let mut le = lo;
147 let v = data[lo];
148 while i <= gt {
149 if data[i] == v {
150 i += 1;
151 } else if data[i] < v {
152 data.swap(le, i);
153 le += 1;
154 i += 1;
155 } else {
156 data.swap(i, gt);
157 gt -= 1;
158 }
159 }
160 if le > lo {
161 quick_sort_for_three_direction(data, lo, le - 1);
162 }
163 quick_sort_for_three_direction(data, i, hi);
164}
165pub fn quick_sort<T>(data: &mut [T], lo: usize, hi: usize)
167where
168 T: PartialOrd + Clone + Copy + Debug + Display,
169{
170 if lo >= hi {
171 return;
172 }
173 if DEBUG {
174 println!("lo:{},hi:{}", lo, hi);
175 }
176 let mut i = lo + 1;
177 let mut j = hi;
178 let v: T = data[lo];
179 loop {
180 loop {
181 if i < hi && data[i] < v {
182 i += 1;
183 } else {
184 break;
185 }
186 }
187 loop {
188 if j > lo && data[j] > v {
189 j -= 1;
190 } else {
191 break;
192 }
193 }
194 if i >= j {
195 break;
196 }
197 if DEBUG {
198 println!("swap:{},{}", data[i], data[j]);
199 println!("swap id:{},{}", i, j);
200 }
201 data.swap(i, j);
202 i += 1;
203 j -= 1;
204 }
205 if DEBUG {
206 println!("swap out:{},{}", data[lo], data[j]);
207 }
208 data.swap(lo, j);
209 if j > 0 {
210 quick_sort(data, lo, j - 1);
211 }
212 quick_sort(data, j + 1, hi);
213}
214
215pub fn shell_sort(data: &mut [i32]) {
217 let mut h = 1;
218 while h < data.len() / 3 {
219 h = h * 3 + 1;
220 }
221 if DEBUG {
222 println!("h:{}", h);
223 }
224 let mut count = 0;
225 let mut s = h;
226 while s >= 1 {
227 if DEBUG {
228 println!("s:{}", s);
229 }
230 for i in RangeStep::new(s, data.len(), s) {
231 for j in RangeStep::new(i, s - 1, s) {
232 if data[j] < data[j - s] {
233 data.swap(j, j - s);
234 count += 1;
235 } else {
236 break;
237 }
238 }
239 }
240 s /= 3;
241 }
242 if DEBUG {
243 println!("count:{}", count);
244 }
245}
246
247pub struct RangeStep<T> {
261 start: T,
262 end: T,
263 step: T,
264 forward: bool,
265}
266impl RangeStep<usize> {
267 pub fn new(start: usize, end: usize, step: usize) -> RangeStep<usize> {
268 let forward = start < end;
269 if step == 0 {
270 panic!("no range: {},{},{}", start, end, step)
271 }
272 RangeStep {
273 start,
274 end,
275 step,
276 forward,
277 }
278 }
279}
280impl Iterator for RangeStep<usize> {
281 type Item = usize;
282
283 fn next(&mut self) -> Option<Self::Item> {
284 let ans = self.start;
285 if self.forward && ans >= self.end || !self.forward && ans <= self.end {
286 return None;
287 }
288 if self.forward {
289 self.start += self.step;
290 } else {
291 self.start -= self.step;
292 }
293 Some(ans)
294 }
295}