added bubble_sort, binary_search, linear_search
This commit is contained in:
commit
f895efce44
13 changed files with 305 additions and 0 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
||||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "algos-in-rs"
|
||||||
|
version = "0.1.0"
|
||||||
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "algos-in-rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
26
flake.lock
generated
Normal file
26
flake.lock
generated
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1715774670,
|
||||||
|
"narHash": "sha256-iJYnKMtLi5u6hZhJm94cRNSDG5Rz6ZzIkGbhPFtDRm0=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "b3fcfcfabd01b947a1e4f36622bbffa3985bdac6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
31
flake.nix
Normal file
31
flake.nix
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
description = "SunServer";
|
||||||
|
|
||||||
|
inputs={
|
||||||
|
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs }@inputs:
|
||||||
|
let
|
||||||
|
supportedSystems = [ "x86_64-linux" ];
|
||||||
|
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||||
|
#v I improved how you call in packages
|
||||||
|
pkgs = forAllSystems (system:
|
||||||
|
import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
#v this can be adjusted to read args passed without impure later
|
||||||
|
# config = { allowUnfreePredicate = pkg: builtins.elem (nixpkgs.lib.getName pkg) [
|
||||||
|
# ];
|
||||||
|
# };
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in {
|
||||||
|
packages = forAllSystems (system: {
|
||||||
|
default = pkgs.${system}.callPackage ./nix/default.nix { };
|
||||||
|
});
|
||||||
|
devShells = forAllSystems (system: {
|
||||||
|
default = pkgs.${system}.callPackage ./nix/devshell.nix { };
|
||||||
|
});
|
||||||
|
nixConfig = {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
11
nix/default.nix
Normal file
11
nix/default.nix
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
{ pkgs ? import <nixpkgs> { }, lib }:
|
||||||
|
|
||||||
|
pkgs.rustPlatform.buildRustPackage rec {
|
||||||
|
pname = "algos-in-rust";
|
||||||
|
version = "1.0.0";
|
||||||
|
cargoLock.lockFile = ../Cargo.lock;
|
||||||
|
src = pkgs.lib.cleanSource ../.;
|
||||||
|
buildInputs = [ ];
|
||||||
|
nativeBuildInputs = [ pkgs.pkg-config ];
|
||||||
|
doCheck = false;
|
||||||
|
}
|
||||||
15
nix/devshell.nix
Normal file
15
nix/devshell.nix
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
{ pkgs ? import <nixpkgs> { } }:
|
||||||
|
pkgs.mkShell {
|
||||||
|
# Get dependencies from the main package
|
||||||
|
inputsFrom = [ (pkgs.callPackage ./default.nix { }) ];
|
||||||
|
# Additional tooling
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
cargo
|
||||||
|
cargo-watch
|
||||||
|
rustc
|
||||||
|
rustup
|
||||||
|
clippy
|
||||||
|
rust-analyzer
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
}
|
||||||
32
nix/flake.nix
Normal file
32
nix/flake.nix
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
description = "SunServer";
|
||||||
|
|
||||||
|
inputs={
|
||||||
|
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs }@inputs:
|
||||||
|
let
|
||||||
|
supportedSystems = [ "x86_64-linux" ];
|
||||||
|
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||||
|
#v I improved how you call in packages
|
||||||
|
pkgs = forAllSystems (system:
|
||||||
|
import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
#v this can be adjusted to read args passed without impure later
|
||||||
|
config = { allowUnfreePredicate = pkg: builtins.elem (nixpkgs.lib.getName pkg) [
|
||||||
|
"unrar"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in {
|
||||||
|
packages = forAllSystems (system: {
|
||||||
|
default = pkgs.${system}.callPackage ./nix/default.nix { };
|
||||||
|
});
|
||||||
|
devShells = forAllSystems (system: {
|
||||||
|
default = pkgs.${system}.callPackage ./nix/devshell.nix { };
|
||||||
|
});
|
||||||
|
nixConfig = {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
63
src/binary_search.rs
Normal file
63
src/binary_search.rs
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
#[cfg (test)]
|
||||||
|
mod tests {
|
||||||
|
use super::binary_search;
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_found() {
|
||||||
|
let haystack = [1, 3, 5, 7, 9];
|
||||||
|
assert_eq!(binary_search(&haystack, 5), Some(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_not_found() {
|
||||||
|
let haystack = [1, 3, 5, 7, 9];
|
||||||
|
assert_eq!(binary_search(&haystack, 4), Some(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_empty() {
|
||||||
|
let haystack: [usize; 0] = [];
|
||||||
|
assert_eq!(binary_search(&haystack, 4), Some(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_single_element_found() {
|
||||||
|
let haystack = [5];
|
||||||
|
assert_eq!(binary_search(&haystack, 5), Some(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_single_element_not_found() {
|
||||||
|
let haystack = [5];
|
||||||
|
assert_eq!(binary_search(&haystack, 3), Some(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_multiple_elements_not_found() {
|
||||||
|
let haystack = [1, 2, 3, 4, 5];
|
||||||
|
assert_eq!(binary_search(&haystack, 6), Some(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_binary_search_multiple_elements_found() {
|
||||||
|
let haystack = [1, 2, 3, 4, 5];
|
||||||
|
assert_eq!(binary_search(&haystack, 3), Some(true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn binary_search(haystack: &[usize], needle: usize) -> Option<bool> {
|
||||||
|
let mut low = 0;
|
||||||
|
let mut high = haystack.len();
|
||||||
|
|
||||||
|
while low < high {
|
||||||
|
let midpoint = low + (high - low) / 2;
|
||||||
|
let value = haystack[midpoint];
|
||||||
|
if value == needle {
|
||||||
|
return Some(true);
|
||||||
|
} else if value > needle {
|
||||||
|
high = midpoint;
|
||||||
|
} else {
|
||||||
|
low = midpoint + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(false)
|
||||||
|
}
|
||||||
51
src/bubble_sort.rs
Normal file
51
src/bubble_sort.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::bubble_sort;
|
||||||
|
#[test]
|
||||||
|
fn bubble_sort_already_sorted_input(){
|
||||||
|
let mut arr = [1, 2, 3, 4, 5];
|
||||||
|
bubble_sort(&mut arr);
|
||||||
|
assert_eq!(arr, [1, 2, 3, 4, 5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bubble_sort_reverse_sorted_input(){
|
||||||
|
let mut arr = [5, 4, 3, 2, 1];
|
||||||
|
bubble_sort(&mut arr);
|
||||||
|
assert_eq!(arr, [1, 2, 3, 4, 5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bubble_sort_input_w_duplicate_elems(){
|
||||||
|
let mut arr = [3, 1, 4, 1, 5, 9, 2, 6, 5];
|
||||||
|
bubble_sort(&mut arr);
|
||||||
|
assert_eq!(arr, [1, 1, 2, 3, 4, 5, 5, 6, 9]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bubble_sort_empty_input(){
|
||||||
|
let mut arr: [usize; 0] = [];
|
||||||
|
bubble_sort(&mut arr);
|
||||||
|
assert_eq!(arr, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bubble_sort_input_w_one_elem(){
|
||||||
|
let mut arr = [42];
|
||||||
|
bubble_sort(&mut arr);
|
||||||
|
assert_eq!(arr, [42]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn bubble_sort(arr: &mut [usize]) {
|
||||||
|
let n = arr.len();
|
||||||
|
for i in 0..n {
|
||||||
|
for j in 0..n - 1 - i {
|
||||||
|
if arr[j] > arr[j + 1] {
|
||||||
|
let tmp = arr[j];
|
||||||
|
arr[j] = arr[j + 1];
|
||||||
|
arr[j + 1] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/linear_search.rs
Normal file
54
src/linear_search.rs
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::linear_search;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_found() {
|
||||||
|
let haystack = [1, 3, 5, 7, 9];
|
||||||
|
assert_eq!(linear_search(&haystack, 5), Some((true, 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_not_found() {
|
||||||
|
let haystack = [1, 3, 5, 7, 9];
|
||||||
|
assert_eq!(linear_search(&haystack, 4), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_empty() {
|
||||||
|
let haystack: [usize; 0] = [];
|
||||||
|
assert_eq!(linear_search(&haystack, 4), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_single_element_found() {
|
||||||
|
let haystack = [5];
|
||||||
|
assert_eq!(linear_search(&haystack, 5), Some((true, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_single_element_not_found() {
|
||||||
|
let haystack = [5];
|
||||||
|
assert_eq!(linear_search(&haystack, 3), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_multiple_elements_not_found() {
|
||||||
|
let haystack = [1, 2, 3, 4, 5];
|
||||||
|
assert_eq!(linear_search(&haystack, 6), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_search_multiple_elements_found() {
|
||||||
|
let haystack = [1, 2, 3, 4, 5];
|
||||||
|
assert_eq!(linear_search(&haystack, 3), Some((true, 2)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn linear_search(haystack: &[usize], needle: usize) -> Option<(bool, usize)> {
|
||||||
|
for (idx, &n) in haystack.iter().enumerate() {
|
||||||
|
if n == needle {
|
||||||
|
return Some((true, idx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
5
src/main.rs
Normal file
5
src/main.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
mod linear_search;
|
||||||
|
mod binary_search;
|
||||||
|
mod bubble_sort;
|
||||||
|
fn main() {
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue