overclocked_sort 0.2.1

Adaptive hybrid sort for integer-like keys: parallel counting on dense ranges with pattern-aware fallback paths.
Documentation
use overclocked_sort::{overclocked_kp_sort, KeyPtr};
use std::fs::File;
use std::io::{Write, BufWriter};
use std::time::Instant;

// Sinh số ngẫu nhiên
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
    }
}

// Ghi toàn bộ Vector (Struct) ra tệp định dạng Nhị phân (Binary) siêu tốc.
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);

    // Chuyển trực tiếp memory block của Vector thành bytes để ghi
    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, // Payload ID / Reference Pointer
        });
    }

    let mut data_std = data.clone();

    // ----------------------------
    // 1. OVERCLOCKED SORT
    // ----------------------------
    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());

    // ----------------------------
    // 2. STD STABLE SORT
    // ----------------------------
    println!("\n▶ Đang chạy: std::slice::sort_by_key (Thuật toán TimSort Stable)...");
    // Lưu ý: Phải dùng Stable Sort vì nếu dùng Unstable Sort thì các phần tử có chung Key 
    // sẽ bị hoán vị con trỏ Ptr ngẫu nhiên -> Mã Hash sẽ báo lỗi (dù về mặt Key là vẫn đúng).
    let start = Instant::now();
    data_std.sort_by_key(|kp| kp.key);
    println!("⏱ Thời gian: {:?}", start.elapsed());

    // ----------------------------
    // 3. GHI FILE VÀ ĐỐI CHIẾU
    // ----------------------------
    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.");
}