Skip to content

Commit d0be0a4

Browse files
authored
Added Selection Sort along with 9 test cases (#31)
1 parent 7623d42 commit d0be0a4

File tree

4 files changed

+102
-0
lines changed

4 files changed

+102
-0
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Every project is managed by the `build.zig` file.
4343
├── sort
4444
│ ├── bubbleSort.zig
4545
│ ├── insertionSort.zig
46+
│ ├── selectionSort.zig
4647
│ ├── mergeSort.zig
4748
│ ├── quickSort.zig
4849
│ └── radixSort.zig

build.zig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ pub fn build(b: *std.Build) void {
4242
.name = "insertionSort.zig",
4343
.category = "sort",
4444
});
45+
if (std.mem.eql(u8, op, "sort/selectionSort"))
46+
buildAlgorithm(b, .{
47+
.optimize = optimize,
48+
.target = target,
49+
.name = "selectionSort.zig",
50+
.category = "sort",
51+
});
4552

4653
// Search algorithms
4754
if (std.mem.eql(u8, op, "search/bSearchTree"))

runall.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub fn main() !void {
3333
try runTest(allocator, "sort/radixsort");
3434
try runTest(allocator, "sort/mergesort");
3535
try runTest(allocator, "sort/insertsort");
36+
try runTest(allocator, "sort/selectionSort");
3637

3738
// Search
3839
try runTest(allocator, "search/bSearchTree");

sort/selectionSort.zig

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
const std = @import("std");
2+
const mem = std.mem;
3+
const expect = std.testing.expect;
4+
5+
// Reference: https://www.geeksforgeeks.org/dsa/selection-sort-algorithm-2/
6+
fn sort(A: []i64) void {
7+
for (0..A.len) |i| {
8+
var smallest: usize = i;
9+
10+
for (i + 1..A.len) |j| {
11+
// condetion: < for ascending order and > for descending order
12+
if (A[j] < A[smallest]) {
13+
smallest = j;
14+
}
15+
}
16+
17+
mem.swap(i64, &A[i], &A[smallest]);
18+
}
19+
}
20+
21+
test "empty array" {
22+
var A = [_]i64{};
23+
sort(&A);
24+
for (A, 0..) |value, i| {
25+
try expect(value == i);
26+
}
27+
}
28+
29+
test "single element" {
30+
var A = [_]i64{0};
31+
sort(&A);
32+
for (A, 0..) |value, i| {
33+
try expect(value == i);
34+
}
35+
}
36+
37+
test "reverse order" {
38+
var A = [_]i64{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
39+
sort(&A);
40+
for (A, 0..) |value, i| {
41+
try expect(value == i);
42+
}
43+
}
44+
45+
test "all same" {
46+
var A = [_]i64{ 0, 0, 0, 0, 0, 0 };
47+
const forTest = [_]i64{ 0, 0, 0, 0, 0, 0 };
48+
sort(&A);
49+
for (A, forTest) |i, j| {
50+
try expect(i == j);
51+
}
52+
}
53+
54+
test "sorted" {
55+
var A = [_]i64{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
56+
sort(&A);
57+
for (A, 0..) |value, i| {
58+
try expect(value == i);
59+
}
60+
}
61+
62+
test "partially sorted" {
63+
var A = [_]i64{ 0, 1, 2, 3, 4, 9, 6, 5, 8, 7 };
64+
sort(&A);
65+
for (A, 0..) |value, i| {
66+
try expect(value == i);
67+
}
68+
}
69+
70+
test "last two unordered" {
71+
var A = [_]i64{ 0, 1, 2, 3, 4, 5, 6, 7, 9, 8 };
72+
sort(&A);
73+
for (A, 0..) |value, i| {
74+
try expect(value == i);
75+
}
76+
}
77+
78+
test "first two unordered" {
79+
var A = [_]i64{ 1, 0, 2, 3, 4, 5, 6, 7, 8, 9 };
80+
sort(&A);
81+
for (A, 0..) |value, i| {
82+
try expect(value == i);
83+
}
84+
}
85+
86+
test "negative numbers with duplicates" {
87+
var A = [_]i64{ -6, -3, 6, 0, -7, 2, 1, 8, -5, 1, 6 };
88+
const sortedA = [_]i64{ -7, -6, -5, -3, 0, 1, 1, 2, 6, 6, 8 };
89+
sort(&A);
90+
for (A, sortedA) |i, j| {
91+
try expect(i == j);
92+
}
93+
}

0 commit comments

Comments
 (0)