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// }