initial zad4 work
This commit is contained in:
parent
b59437d3c7
commit
a5198e7c49
4 changed files with 106 additions and 0 deletions
1
lab2/zad4/.gitignore
vendored
Normal file
1
lab2/zad4/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
target/
|
14
lab2/zad4/Cargo.lock
generated
Normal file
14
lab2/zad4/Cargo.lock
generated
Normal file
|
@ -0,0 +1,14 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "libsort"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "zad4"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"libsort",
|
||||
]
|
7
lab2/zad4/Cargo.toml
Normal file
7
lab2/zad4/Cargo.toml
Normal file
|
@ -0,0 +1,7 @@
|
|||
[package]
|
||||
name = "zad4"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
libsort = { path = "../zad1/libsort" }
|
84
lab2/zad4/src/main.rs
Normal file
84
lab2/zad4/src/main.rs
Normal file
|
@ -0,0 +1,84 @@
|
|||
use libsort::{quick_sort, SortResult};
|
||||
|
||||
#[derive(PartialEq)]
|
||||
enum CompareResult {
|
||||
LESS, EQUAL, GREATER
|
||||
}
|
||||
|
||||
fn compare(a: u64, b: u64, comparisons: &mut u64) -> CompareResult {
|
||||
*comparisons += 1;
|
||||
if a < b {
|
||||
CompareResult::LESS
|
||||
} else if a > b {
|
||||
CompareResult::GREATER
|
||||
} else {
|
||||
CompareResult::EQUAL
|
||||
}
|
||||
}
|
||||
|
||||
fn swap(list: &mut [u64], i: usize, j: usize, swaps: &mut u64) {
|
||||
*swaps += 1;
|
||||
list.swap(i, j);
|
||||
}
|
||||
|
||||
use CompareResult::*;
|
||||
|
||||
fn dual_pivot_partition(list: &mut [u64], res: &mut SortResult) -> (usize, usize) {
|
||||
let mut comps = 0;
|
||||
let mut swaps = 0;
|
||||
if compare(list[0], list[list.len() - 1], &mut comps) == GREATER {
|
||||
swap(list, 0, list.len() - 1, &mut swaps);
|
||||
}
|
||||
|
||||
let mut l = 1;
|
||||
let mut g = list.len() - 2;
|
||||
let mut k = l;
|
||||
let p = list[0];
|
||||
let q = list[list.len()];
|
||||
|
||||
while k <= g {
|
||||
if compare(list[k], p, &mut comps) == LESS {
|
||||
swap(list, k, l, &mut swaps);
|
||||
l += 1;
|
||||
} else if compare(list[k], q, &mut comps) != LESS {
|
||||
while compare(list[g], q, &mut comps) == GREATER && k < g {
|
||||
g -= 1;
|
||||
}
|
||||
swap(list, k, g, &mut swaps);
|
||||
g -= 1;
|
||||
if compare(list[k], p, &mut comps) == LESS {
|
||||
swap(list, k, l, &mut swaps);
|
||||
l += 1;
|
||||
}
|
||||
}
|
||||
k += 1;
|
||||
}
|
||||
|
||||
l -= 1;
|
||||
g += 1;
|
||||
|
||||
swap(list, 0, l, &mut swaps);
|
||||
swap(list, list.len() - 1, g, &mut swaps);
|
||||
|
||||
res.comparisons += comps;
|
||||
res.swaps += swaps;
|
||||
|
||||
(l, g)
|
||||
}
|
||||
|
||||
fn dual_pivot_quick_sort(list: &mut [u64]) -> SortResult {
|
||||
let mut res = SortResult::default();
|
||||
|
||||
let (lp, rp) = dual_pivot_partition(list, &mut res);
|
||||
let res1 = dual_pivot_quick_sort(&mut list[..(lp - 1)]);
|
||||
let res2 = dual_pivot_quick_sort(&mut list[(lp + 1)..=(rp - 1)]);
|
||||
let res3 = dual_pivot_quick_sort(&mut list[(rp + 1)..]);
|
||||
|
||||
res.comparisons += res1.comparisons + res2.comparisons + res3.comparisons;
|
||||
res.swaps += res1.swaps + res2.swaps + res3.swaps;
|
||||
|
||||
res
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
Loading…
Reference in a new issue