Work on assignment 3
This commit is contained in:
10000
data/course_1_assignment_3.txt
Normal file
10000
data/course_1_assignment_3.txt
Normal file
File diff suppressed because it is too large
Load Diff
27
src/main.rs
27
src/main.rs
@@ -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
61
src/quick_sort.rs
Normal 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();
|
||||
}
|
||||
Reference in New Issue
Block a user