use overclocked_sort::{overclocked_kp_sort, KeyPtr};
use std::fs::File;
use std::io::{Write, BufWriter};
use std::time::Instant;
struct Lcg { seed: u64 }
impl Lcg {
fn next(&mut self) -> u32 {
self.seed = self.seed.wrapping_mul(6364136223846793005).wrapping_add(1);
(self.seed >> 32) as u32
}
}
fn write_to_binary_file(filename: &str, data: &[KeyPtr]) {
let file = File::create(filename).expect("Không thể tạo file");
let mut writer = BufWriter::new(file);
let byte_slice = unsafe {
std::slice::from_raw_parts(
data.as_ptr() as *const u8,
data.len() * std::mem::size_of::<KeyPtr>(),
)
};
writer.write_all(byte_slice).expect("Lỗi khi ghi bytes");
}
fn main() {
let n = 10_000_000;
let max_val = 50_000;
let mut rng = Lcg { seed: 1337 };
println!("[1] Tạo {N} Struct Ngẫu Nhiên (KeyPtr). Định mức M: {M}", N=n, M=max_val);
let mut data = Vec::with_capacity(n);
for i in 0..n {
data.push(KeyPtr {
key: (rng.next() % (max_val as u32 + 1)) as i32,
ptr: i as u64, });
}
let mut data_std = data.clone();
println!("\n▶ Đang chạy: Overclocked KP Sort...");
let start = Instant::now();
let result_ovc = overclocked_kp_sort(&data, max_val);
println!("⏱ Thời gian: {:?}", start.elapsed());
println!("\n▶ Đang chạy: std::slice::sort_by_key (Thuật toán TimSort Stable)...");
let start = Instant::now();
data_std.sort_by_key(|kp| kp.key);
println!("⏱ Thời gian: {:?}", start.elapsed());
println!("\n[2] Ghi toàn bộ dữ liệu bộ nhớ của Struct (Binary) ra đĩa cứng...");
write_to_binary_file("overclocked_output.bin", &result_ovc);
write_to_binary_file("std_sort_output.bin", &data_std);
println!("✔ Hoàn thành! 2 tệp .bin đã được ghi.");
}