-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquicksort.zig
More file actions
64 lines (56 loc) · 1.88 KB
/
quicksort.zig
File metadata and controls
64 lines (56 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const std = @import("std");
pub fn quicksort(data: []f32) callconv(.C) void {
if (data.len == 0) return; // Handle edge case for empty array
_quicksort(data, 0, @as(i32, @intCast(data.len)) - 1);
}
fn _quicksort(data: []f32, lo: i32, hi: i32) void {
if (lo < hi) {
const pivot: i32 = _partition(data, lo, hi);
_quicksort(data, lo, pivot - 1);
_quicksort(data, pivot + 1, hi);
}
}
fn _partition(data: []f32, lo: i32, hi: i32) i32 {
const pivot: f32 = data[@as(usize, @intCast(hi))];
var i: i32 = lo;
for (@as(usize, @intCast(lo))..@as(usize, @intCast(hi))) |j| {
if (data[@as(usize, j)] < pivot) {
// Swap data[i] and data[j]
const tmp: f32 = data[@as(usize, @intCast(i))];
data[@as(usize, @intCast(i))] = data[@as(usize, @intCast(j))];
data[@as(usize, @intCast(j))] = tmp;
i += 1;
}
}
// Swap data[i] and data[hi] (put pivot in the correct position)
const tmp: f32 = data[@as(usize, @intCast(i))];
data[@as(usize, @intCast(i))] = data[@as(usize, @intCast(hi))];
data[@as(usize, @intCast(hi))] = tmp;
return i;
}
test "quicksort works" {
var data = [_]f32{
0.13681683672951306,
0.7905094550709765,
0.3252756667712565,
0.2131963197688399,
0.16932159094787846,
0.11964511583749737,
0.7777372448181608,
0.35614796449114383,
0.8232391705420822,
};
const expected_results = [_]f32{
0.11964511583749737,
0.13681683672951306,
0.16932159094787846,
0.2131963197688399,
0.3252756667712565,
0.35614796449114383,
0.7777372448181608,
0.7905094550709765,
0.8232391705420822,
};
quicksort(data[0..]); // Pass the slice to quicksort
try std.testing.expectEqualSlices(f32, expected_results[0..], data[0..]);
}