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
|
const std = @import("std");
fn checkOrder(
comptime T: type,
allocator: std.mem.Allocator,
arr: []T,
) !std.ArrayList(usize) {
var ret = std.ArrayList(usize).init(allocator);
errdefer ret.deinit();
const sorted = try allocator.alloc(u8, arr.len);
defer allocator.free(sorted);
std.mem.copyForwards(T, sorted, arr);
std.mem.sort(T, sorted, {}, std.sort.asc(T));
for (sorted, 0..) |_, i| {
if (sorted[i] != arr[i]) {
try ret.append(i);
}
}
return ret;
}
fn printArrayList(
comptime T: type,
al: std.ArrayList(T),
) void {
for (al.items) |e| {
std.debug.print("{} ", .{e});
}
std.debug.print("{s}", .{"\n"});
}
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer {
std.debug.assert(gpa.detectLeaks() == false);
std.debug.assert(gpa.deinit() == .ok);
}
const allocator = gpa.allocator();
var arr1 = [_]u8{ 5, 2, 4, 3, 1 };
var arr2 = [_]u8{ 1, 2, 1, 1, 3 };
var arr3 = [_]u8{ 3, 1, 3, 2, 3 };
const al1 = try checkOrder(u8, allocator, &arr1);
const al2 = try checkOrder(u8, allocator, &arr2);
const al3 = try checkOrder(u8, allocator, &arr3);
defer {
al1.deinit();
al2.deinit();
al3.deinit();
}
printArrayList(usize, al1);
printArrayList(usize, al2);
printArrayList(usize, al3);
}
|