my_lib_akniet/
lib.rs

1pub enum SortingAlgorithm {
2    QuickSort,
3    SelectSort,
4    InsertSort,
5    MergeSort,
6}
7
8pub struct MyVec<T>(pub Vec<T>);
9
10pub trait Sortable<T> {
11    fn sort(&mut self, algorithm: SortingAlgorithm, compare: fn(&T, &T) -> bool);
12}
13
14impl<T: PartialOrd + Clone> Sortable<T> for MyVec<T> {
15    fn sort(&mut self, algorithm: SortingAlgorithm, compare: fn(&T, &T) -> bool) {
16        match algorithm {
17            SortingAlgorithm::QuickSort => self.quick_sort(compare),
18            SortingAlgorithm::SelectSort => self.select_sort(compare),
19            SortingAlgorithm::InsertSort => self.insert_sort(compare),
20            SortingAlgorithm::MergeSort => self.merge_sort(compare),
21        }
22    }
23}
24
25impl<T: PartialOrd + Clone> MyVec<T> {
26    fn quick_sort(&mut self, compare: fn(&T, &T) -> bool) {
27        fn partition<T: PartialOrd>(arr: &mut [T], compare: fn(&T, &T) -> bool) -> usize {
28            let pivot_index = arr.len() - 1;
29            let mut i = 0;
30    
31            for j in 0..pivot_index {
32                if compare(&arr[j], &arr[pivot_index]) {
33                    arr.swap(i, j);
34                    i += 1;
35                }
36            }
37    
38            arr.swap(i, pivot_index);
39            i
40        }
41    
42        fn quick_sort_recursive<T: PartialOrd>(arr: &mut [T], compare: fn(&T, &T) -> bool) {
43            if arr.len() <= 1 {
44                return;
45            }
46    
47            let pivot_index = partition(arr, compare);
48            quick_sort_recursive(&mut arr[0..pivot_index], compare);
49            quick_sort_recursive(&mut arr[(pivot_index + 1)..], compare);
50        }
51    
52        quick_sort_recursive(&mut self.0, compare);
53    }
54
55    fn select_sort(&mut self, compare: fn(&T, &T) -> bool) {
56        let n = self.0.len();
57        for i in 0..n {
58            let mut min_index = i;
59            for j in (i + 1)..n {
60                if compare(&self.0[j], &self.0[min_index]) {
61                    min_index = j;
62                }
63            }
64            if min_index != i {
65                self.0.swap(min_index, i);
66            }
67        }
68    }
69
70    fn insert_sort(&mut self, compare: fn(&T, &T) -> bool) {
71        for i in 1..self.0.len() {
72            let key = self.0[i].clone();
73            let mut j = i;
74            while j > 0 && compare(&key, &self.0[j - 1]) {
75                self.0[j] = self.0[j - 1].clone();
76                j -= 1;
77            }
78            self.0[j] = key;
79        }
80    }
81
82    fn merge_sort(&mut self, compare: fn(&T, &T) -> bool) {
83        fn merge<T: PartialOrd + Clone>(left: &[T], right: &[T], compare: fn(&T, &T) -> bool) -> Vec<T> {
84            let mut result = Vec::new();
85            let (mut i, mut j) = (0, 0);
86
87            while i < left.len() && j < right.len() {
88                if compare(&left[i], &right[j]) {
89                    result.push(left[i].clone());
90                    i += 1;
91                } else {
92                    result.push(right[j].clone());
93                    j += 1;
94                }
95            }
96
97            result.extend_from_slice(&left[i..]);
98            result.extend_from_slice(&right[j..]);
99            result
100        }
101
102        fn merge_sort_recursive<T: PartialOrd + Clone>(arr: &[T], compare: fn(&T, &T) -> bool) -> Vec<T> {
103            if arr.len() <= 1 {
104                return arr.to_vec();
105            }
106
107            let mid = arr.len() / 2;
108            let left = merge_sort_recursive(&arr[..mid], compare);
109            let right = merge_sort_recursive(&arr[mid..], compare);
110            merge(&left, &right, compare)
111        }
112
113        self.0 = merge_sort_recursive(&self.0, compare);
114    }
115}
116
117
118#[cfg(test)]
119mod tests {
120    use super::*;
121
122    #[test]
123    fn test_quick_sort() {
124        let mut numbers = MyVec(vec![4, 2, 5, 1, 3]);
125        numbers.sort(SortingAlgorithm::QuickSort, |a, b| a < b);
126        assert_eq!(numbers.0, vec![1, 2, 3, 4, 5]);
127    }
128
129    #[test]
130    fn test_select_sort() {
131        let mut numbers = MyVec(vec![4, 2, 5, 1, 3]);
132        numbers.sort(SortingAlgorithm::SelectSort, |a, b| a < b);
133        assert_eq!(numbers.0, vec![1, 2, 3, 4, 5]);
134    }
135
136    #[test]
137    fn test_insert_sort() {
138        let mut numbers = MyVec(vec![4, 2, 5, 1, 3]);
139        numbers.sort(SortingAlgorithm::InsertSort, |a, b| a < b);
140        assert_eq!(numbers.0, vec![1, 2, 3, 4, 5]);
141    }
142
143    #[test]
144    fn test_merge_sort() {
145        let mut numbers = MyVec(vec![4, 2, 5, 1, 3]);
146        numbers.sort(SortingAlgorithm::MergeSort, |a, b| a < b);
147        assert_eq!(numbers.0, vec![1, 2, 3, 4, 5]);
148    }
149}
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167//cio4BJBQmQktydoB1c1SKB7SAA24ASgGnz3
168
169
170
171
172// // Define a public enum for sorting algorithms
173// pub enum SortingAlgorithm {
174//     QuickSort,
175//     SelectSort,
176//     InsertSort,
177//     MergeSort,
178// }
179
180// pub struct MyVec<T>(pub Vec<T>);
181
182// // Define a public trait for objects that can be sorted
183// pub trait Sortable<T: PartialOrd + Clone> {
184//     fn sort(&mut self, algorithm: SortingAlgorithm);
185// }
186
187// // Implement Sortable trait for Vec<T>
188// impl<T: PartialOrd + Clone> Sortable<T> for MyVec<T> {
189//     fn sort(&mut self, algorithm: SortingAlgorithm) {
190//         match algorithm {
191//             SortingAlgorithm::QuickSort => self.quick_sort(),
192//             SortingAlgorithm::SelectSort => self.select_sort(),
193//             SortingAlgorithm::InsertSort => self.insert_sort(),
194//             SortingAlgorithm::MergeSort => self.merge_sort(),
195//         }
196//     }
197// }
198
199// impl<T: PartialOrd + Clone> MyVec<T> {
200//     fn quick_sort(&mut self) {
201//         // Implementation of quick sort algorithm
202//         fn partition<T: PartialOrd>(arr: &mut [T]) -> usize {
203//             let pivot_index = arr.len() - 1;
204//             let mut i = 0;
205    
206//             for j in 0..pivot_index {
207//                 if arr[j] <= arr[pivot_index] {
208//                     arr.swap(i, j);
209//                     i += 1;
210//                 }
211//             }
212    
213//             arr.swap(i, pivot_index);
214//             i
215//         }
216    
217//         fn quick_sort_recursive<T: PartialOrd>(arr: &mut [T]) {
218//             if arr.len() <= 1 {
219//                 return;
220//             }
221    
222//             let pivot_index = partition(arr);
223//             quick_sort_recursive(&mut arr[0..pivot_index]);
224//             quick_sort_recursive(&mut arr[(pivot_index + 1)..]);
225//         }
226    
227//         quick_sort_recursive(&mut self.0);
228//     }
229    
230
231//     fn select_sort(&mut self) {
232//         // Implementation of selection sort algorithm
233//         let n = self.0.len();
234//         for i in 0..n {
235//             let mut min_index = i;
236//             for j in (i + 1)..n {
237//                 if self.0[j] < self.0[min_index] {
238//                     min_index = j;
239//                 }
240//             }
241//             if min_index != i {
242//                 self.0.swap(min_index, i);
243//             }
244//         }
245//     }
246
247//     fn insert_sort(&mut self) {
248//         // Implementation of insertion sort algorithm
249//         for i in 1..self.0.len() {
250//             let key = &self.0[i].clone();
251//             let mut j = i;
252//             while j > 0 && self.0[j - 1] > *key {
253//                 self.0[j] = self.0[j - 1].clone();
254//                 j -= 1;
255//             }
256//             self.0[j] = key.clone();
257//         }
258//     }
259
260//     fn merge_sort(&mut self) {
261//         // Implementation of merge sort algorithm
262//         fn merge<T: PartialOrd + Clone>(left: &[T], right: &[T]) -> Vec<T> {
263//             let mut result = Vec::new();
264//             let (mut i, mut j) = (0, 0);
265
266//             while i < left.len() && j < right.len() {
267//                 if left[i] <= right[j] {
268//                     result.push(left[i].clone());
269//                     i += 1;
270//                 } else {
271//                     result.push(right[j].clone());
272//                     j += 1;
273//                 }
274//             }
275
276//             result.extend_from_slice(&left[i..]);
277//             result.extend_from_slice(&right[j..]);
278//             result
279//         }
280
281//         fn merge_sort_recursive<T: PartialOrd + Clone>(arr: &[T]) -> Vec<T> {
282//             if arr.len() <= 1 {
283//                 return arr.to_vec();
284//             }
285
286//             let mid = arr.len() / 2;
287//             let left = merge_sort_recursive(&arr[..mid]);
288//             let right = merge_sort_recursive(&arr[mid..]);
289//             merge(&left, &right)
290//         }
291
292//         self.0 = merge_sort_recursive(&self.0);
293//     }
294// }
295
296// #[cfg(test)]
297// mod tests {
298//     use super::*;
299
300//     #[test]
301//     fn test_quick_sort() {
302//         let mut numbers = vec![4, 2, 5, 1, 3];
303//         numbers.sort(SortingAlgorithm::QuickSort);
304//         assert_eq!(numbers, vec![1, 2, 3, 4, 5]);
305//     }
306
307//     #[test]
308//     fn test_select_sort() {
309//         let mut numbers = vec![4, 2, 5, 1, 3];
310//         numbers.sort(SortingAlgorithm::SelectSort);
311//         assert_eq!(numbers, vec![1, 2, 3, 4, 5]);
312//     }
313
314//     #[test]
315//     fn test_insert_sort() {
316//         let mut numbers = vec![4, 2, 5, 1, 3];
317//         numbers.sort(SortingAlgorithm::InsertSort);
318//         assert_eq!(numbers, vec![1, 2, 3, 4, 5]);
319//     }
320
321//     #[test]
322//     fn test_merge_sort() {
323//         let mut numbers = vec![4, 2, 5, 1, 3];
324//         numbers.sort(SortingAlgorithm::MergeSort);
325//         assert_eq!(numbers, vec![1, 2, 3, 4, 5]);
326//     }
327// }
328
329// pub enum SortingAlgorithm {
330//     QuickSort,
331//     SelectSort,
332//     InsertSort,
333//     MergeSort,
334// }
335
336// // Define a public struct for a vector wrapper
337// pub struct MyVec<T>(pub Vec<T>);
338
339// // Define a public trait for objects that can be sorted
340// pub trait Sortable<T: PartialOrd + Clone> {
341//     fn sort(&mut self, algorithm: SortingAlgorithm, compare: impl Fn(&T, &T) -> bool);
342// }
343
344
345// impl<T: PartialOrd + Clone + PartialEq + Copy> MyVec<T> {
346//     fn quick_sort(&mut self, compare: impl Fn(&T, &T) -> bool) {
347//         self.quick_sort_recursive(0, self.0.len() - 1, &compare);
348//     }
349
350//     fn quick_sort_recursive(&mut self, low: usize, high: usize, compare: &impl Fn(&T, &T) -> bool) {
351//         if low < high {
352//             let pi = self.partition(low, high, compare);
353//             if pi > 0 {
354//                 self.quick_sort_recursive(low, pi - 1, compare);
355//             }
356//             self.quick_sort_recursive(pi + 1, high, compare);
357//         }
358//     }
359
360//     fn partition(&mut self, low: usize, high: usize, compare: &impl Fn(&T, &T) -> bool) -> usize {
361//         let pivot = &self.0[high];
362//         let mut i = low;
363//         for j in low..high {
364//             if compare(&self.0[j], pivot) {
365//                 self.0.swap(i, j);
366//                 i += 1;
367//             }
368//         }
369//         self.0.swap(i, high);
370//         i
371//     }
372
373//     fn select_sort(&mut self, compare: impl Fn(&T, &T) -> bool) {
374//         for i in 0..self.0.len() {
375//             let mut min_index = i;
376//             for j in (i + 1)..self.0.len() {
377//                 if compare(&self.0[j], &self.0[min_index]) {
378//                     min_index = j;
379//                 }
380//             }
381//             if i != min_index {
382//                 self.0.swap(i, min_index);
383//             }
384//         }
385//     }
386
387//     fn insert_sort(&mut self, compare: impl Fn(&T, &T) -> bool) {
388//         for i in 1..self.0.len() {
389//             let mut j = i;
390//             while j > 0 && compare(&self.0[j], &self.0[j - 1]) {
391//                 self.0.swap(j, j - 1);
392//                 j -= 1;
393//             }
394//         }
395//     }
396
397//     fn merge_sort(&mut self, compare: impl Fn(&T, &T) -> bool) {
398//         let len = self.0.len();
399//         if len <= 1 {
400//             return;
401//         }
402
403//         let mid = len / 2;
404//         let mut left = self.0[..mid].to_vec();
405//         let mut right = self.0[mid..].to_vec();
406
407//         self.merge_sort_recursive(&mut left, compare);
408//         self.merge_sort_recursive(&mut right, compare);
409
410//         self.merge(&mut left, &mut right, compare);
411//     }
412
413//     fn merge_sort_recursive(&mut self, arr: &mut [T], compare: impl Fn(&T, &T) -> bool) {
414//         if arr.len() <= 1 {
415//             return;
416//         }
417//         let mid = arr.len() / 2;
418//         let mut left = arr[..mid].to_vec();
419//         let mut right = arr[mid..].to_vec();
420//         self.merge_sort_recursive(&mut left, &compare);
421//         self.merge_sort_recursive(&mut right, &compare);
422//         self.merge(&mut left, &mut right, compare);
423//         arr.iter_mut().zip(left.iter()).for_each(|(a, b)| *a = b.clone());
424//     }
425
426//     fn merge(&mut self, left: &mut Vec<T>, right: &mut Vec<T>, compare: impl Fn(&T, &T) -> bool) {
427//         let mut i = 0;
428//         let mut j = 0;
429//         let mut k = 0;
430
431//         while i < left.len() && j < right.len() {
432//             if compare(&left[i], &right[j]) {
433//                 self.0[k] = left[i].clone();
434//                 i += 1;
435//             } else {
436//                 self.0[k] = right[j].clone();
437//                 j += 1;
438//             }
439//             k += 1;
440//         }
441
442//         while i < left.len() {
443//             self.0[k] = left[i].clone();
444//             i += 1;
445//             k += 1;
446//         }
447
448//         while j < right.len() {
449//             self.0[k] = right[j].clone();
450//             j += 1;
451//             k += 1;
452//         }
453//     }
454// }