Skip to content

Commit aaf3bde

Browse files
committed
Shell sort added
1 parent a97c243 commit aaf3bde

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

benches/sort_benchmark.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use sorting_algorithm::bubblesort;
44
use sorting_algorithm::mergesort;
55
use sorting_algorithm::quicksort;
66
use sorting_algorithm::insertionsort;
7+
use sorting_algorithm::shellsort;
78

89
fn sorting_benchmarks(c: &mut Criterion) {
910
let mut group = c.benchmark_group("Sorting Algorithms");
@@ -44,6 +45,15 @@ fn sorting_benchmarks(c: &mut Criterion) {
4445
BatchSize::SmallInput,
4546
)
4647
});
48+
// Shell sort benchmark (Time complexity: O(nlogn))
49+
group.bench_function(BenchmarkId::new("Shell Sort", i), |b| {
50+
b.iter_batched_ref(
51+
|| -> Vec<usize> { (0..i).map(|_| rng.sample(&range)).collect() },
52+
|v| shellsort (v),
53+
BatchSize::SmallInput,
54+
)
55+
});
56+
4757
}
4858
group.finish();
4959
}

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ mod bubble_sort;
22
mod quick_sort;
33
mod insertion_sort;
44
mod merge_sort;
5+
mod shell_sort;
56

67
pub use bubble_sort::bubblesort;
78
pub use quick_sort::quicksort;
89
pub use insertion_sort::insertionsort;
910
pub use merge_sort::mergesort;
11+
pub use shell_sort::shellsort;
1012

1113
use rand::Rng;
1214
use std::{ops::Range, ops::RangeBounds, ops::Bound};

src/shell_sort.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/// Shell sort
2+
///
3+
/// # Ilustration
4+
/// ``` ignore
5+
/// arr = [ 8, 5, 9, 2, 7 ]
6+
///
7+
/// gap = 5 / 2 = 2
8+
///
9+
/// [ 8, 5, 9, 2, 7 ] -> [ 5, 8, 2, 7, 9 ]
10+
///
11+
/// gap = 2 / 2 = 1
12+
///
13+
/// [ 5, 8, 2, 7, 9 ] -> [ 2, 5, 7, 8, 9 ]
14+
/// ```
15+
///
16+
/// # Complexity
17+
///
18+
/// | Best | Average | Worst |
19+
/// |------|---------|-------|
20+
/// | O(n) | O(n^2) | O(n^2)|
21+
///
22+
pub fn shellsort<T: Ord + Copy>(arr: &mut [T]) {
23+
let len = arr.len();
24+
let mut gap = len / 2;
25+
while gap > 0 {
26+
for i in gap..len {
27+
let temp = arr[i];
28+
let mut j = i;
29+
while j >= gap && arr[j - gap] > temp {
30+
arr[j] = arr[j - gap];
31+
j -= gap;
32+
}
33+
arr[j] = temp;
34+
}
35+
gap /= 2;
36+
}
37+
}

0 commit comments

Comments
 (0)