summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortyropro <[email protected]>2026-06-06 00:28:59 +0100
committertyropro <[email protected]>2026-06-06 00:28:59 +0100
commit10f01cbe090670c229d34440912758b0064b8f17 (patch)
tree77c3034b47de81d1ad9e4bc58afea7069adcb445
parent4ac54b58d6879958d819d810108c0ef012cc3984 (diff)
finished merge sort dual threadHEADmain
-rw-r--r--rng_gen.py9
-rw-r--r--src/main.rs92
2 files changed, 88 insertions, 13 deletions
diff --git a/rng_gen.py b/rng_gen.py
new file mode 100644
index 0000000..e399be9
--- /dev/null
+++ b/rng_gen.py
@@ -0,0 +1,9 @@
+from random import randint
+
+nums = []
+
+for i in range(100):
+ nums.append(randint(0, 2048))
+
+for num in nums:
+ print(f"{num}, ", end="")
diff --git a/src/main.rs b/src/main.rs
index 8db0e1b..d7263d2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,24 +1,90 @@
+use std::thread;
+
fn main() {
- let arr_to_sort = vec![631, 476, 134, 412, 751];
+ let arr_to_sort = vec![
+ 164, 1194, 660, 689, 1086, 18, 44, 61, 524, 1800, 503, 517, 1422, 1320, 1635, 1057, 1324,
+ 73, 673, 1206, 1258, 1085, 1856, 1373, 1293, 235, 1226, 1235, 1287, 1699, 1365, 1449, 1082,
+ 514, 81, 194, 1435, 982, 983, 1172, 1342, 1099, 1874, 1327, 229, 52, 1804, 1674, 1133, 165,
+ 1711, 1693, 1967, 518, 1091, 926, 1832, 584, 1224, 829, 1874, 1582, 1042, 1724, 863, 1261,
+ 1915, 512, 224, 2043, 768, 1001, 1143, 587, 1972, 260, 1177, 1027, 358, 193, 1430, 654,
+ 122, 891, 519, 716, 1907, 1638, 1934, 1116, 745, 762, 1572, 1130, 1889, 1965, 1428, 1187,
+ 1490, 274,
+ ];
+
+ // let mut lists: Vec<Vec<i32>> = Vec::new();
+
+ let halfway = arr_to_sort.len() / 2;
+
+ let mut list_a: Vec<Vec<i32>> = make_lists(&arr_to_sort, 0, halfway);
+ let mut list_b: Vec<Vec<i32>> = make_lists(&arr_to_sort, halfway, arr_to_sort.len());
+
+ // while lists.len() != 1 {
+ // let mut index = 0;
+ // while index < lists.len() - 1 {
+ // let new_list = merge(&lists[index], &lists[index + 1]);
+ // lists[index] = new_list;
+ // lists.remove(index + 1);
+ // index += 1;
+ // }
+ // }
+
+ let mut handles = Vec::new();
+
+ handles.push(thread::spawn(move || {
+ while list_a.len() != 1 {
+ let mut index = 0;
+ while index < list_a.len() - 1 {
+ let new_list = merge(&list_a[index], &list_a[index + 1]);
+ list_a[index] = new_list;
+ list_a.remove(index + 1);
+ index += 1;
+ }
+ }
+ list_a
+ }));
- let mut lists: Vec<Vec<i32>> = Vec::new();
+ handles.push(thread::spawn(move || {
+ while list_b.len() != 1 {
+ let mut index = 0;
+ while index < list_b.len() - 1 {
+ let new_list = merge(&list_b[index], &list_b[index + 1]);
+ list_b[index] = new_list;
+ list_b.remove(index + 1);
+ index += 1;
+ }
+ }
+ list_b
+ }));
+
+ let mut results = Vec::new();
+ for handle in handles {
+ results.push(handle.join().unwrap());
+ }
- for elem in arr_to_sort {
- let item = vec![elem];
- lists.push(item);
+ if results.len() != 2 {
+ panic!("Oh no! A thread isn't done yet");
}
- while lists.len() != 1 {
- let mut index = 0;
- while index < lists.len() - 1 {
- let new_list = merge(&lists[index], &lists[index + 1]);
- lists[index] = new_list;
- lists.remove(index + 1);
- index += 1;
+ let mut final_threads_list = Vec::new();
+ for result in results {
+ for elem in result {
+ final_threads_list.push(elem);
}
}
- println!("{:?}", lists[0]);
+ let final_list = merge(&final_threads_list[0], &final_threads_list[1]);
+
+ // println!("{:?}", lists[0]);
+ println!("{:?}", final_list);
+}
+
+fn make_lists(arr_to_sort: &Vec<i32>, lower_bound: usize, upper_bound: usize) -> Vec<Vec<i32>> {
+ let mut new_list: Vec<Vec<i32>> = Vec::new();
+ for i in lower_bound..upper_bound {
+ let item = vec![arr_to_sort[i]];
+ new_list.push(item);
+ }
+ new_list
}
fn merge(list_1: &Vec<i32>, list_2: &Vec<i32>) -> Vec<i32> {