Work on assignment 3

This commit is contained in:
2020-11-19 20:37:42 -05:00
parent d845ce64a4
commit a8975c0864
4 changed files with 10084 additions and 4 deletions

10000
data/course_1_assignment_3.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,7 @@
mod merge_sort;
mod quick_sort;
use crate::quick_sort::quick_sort;
use crate::merge_sort::merge_sort_inversions;
use std::fs::File;
use std::io;
@@ -20,13 +23,29 @@ fn read_to_vector(path: &str) -> Result<Vec<i64>, io::Error> {
Ok(v)
}
#[allow(dead_code)]
fn c1a2() {
let vec = read_to_vector("data/week_2_assignment_2.txt").unwrap();
let vec = read_to_vector("data/course_1_assignment_2.txt").unwrap();
let (_sorted, inversions) = merge_sort_inversions(vec);
// println!("{:?}", sorted.len());
println!("course 1 assignment 2: {:?}", inversions);
}
fn main() {
c1a2();
fn c1a3() {
// let mut vec = read_to_vector("data/course_1_assignment_3.txt").unwrap();
let mut vec = vec![2, 20, 1, 15, 3, 11, 13, 6, 16, 10, 19, 5, 4, 9, 8, 14, 18, 17, 7, 12];
let mut comp_acc: usize = 0;
quick_sort(&mut vec, &mut comp_acc);
// println!("{:?}", vec);
println!("{:?}", comp_acc);
println!("{:?}", 3/2);
/*
1: 162085
2: 164123
3: ?
*/
}
fn main() {
//c1a2();
c1a3();
}

61
src/quick_sort.rs Normal file
View File

@@ -0,0 +1,61 @@
use std::cmp::PartialOrd;
#[allow(dead_code)]
fn median_of_three<T: PartialOrd + std::fmt::Debug>( v: &[T]) -> usize {
if v.len() < 3 {
return 0;
}
let left = 0;
let middle = if v.len() % 2 == 0 {
v.len() / 2 - 1
} else {
v.len() / 2
};
let right = v.len() - 1;
/* TODO: finish here */
return 0;
}
#[allow(dead_code)]
fn bubble_sort<T: PartialOrd>( v: &mut [T]) -> () {
let mut unsorted = true;
if v.len() <= 1 {
return
}
while unsorted {
unsorted = false;
for i in 0..v.len() - 1 {
if v[i] > v[i + 1] {
v.swap(i, i + 1);
unsorted = true;
}
}
}
}
pub fn quick_sort<T: PartialOrd + std::fmt::Debug>( v: &mut [T], comp_acc: &mut usize) -> () {
if v.len() <= 1 {
return;
}
// let pivot_index = 0;
// let pivot_index = v.len() - 1;
let pivot_index = median_of_three(&v);
let mut i = 1;
v.swap(0, pivot_index);
for j in 1..v.len() {
if v[j] < v[0] {
v.swap(i, j);
i += 1;
}
}
v.swap(0, i - 1);
quick_sort(&mut v[..i - 1], comp_acc);
quick_sort(&mut v[i..], comp_acc);
*comp_acc += v[..i - 1].len();
*comp_acc += v[i..].len();
}