Home

Awesome

Zort

logo

Implementation of 13 sorting algorithms in Zig

AlgorithmCustom ComparisonZero Allocation
Bubble
Comb
Heap
Insertion
Merge
PDQ
Quick
Radix (no negative yet)
Selection
Shell
Tail
Tim
Twin

Usage

const zort = @import("zort");

fn asc(a: u8, b: u8) bool {
    return a < b;
}

pub fn main() !void {
    var arr = [_]u8{ 9, 1, 4, 12, 3, 4 };
    try zort.quickSort(u8, &arr, asc);
}

Benchmarks

run this to see results on your machine:

zig build bench -Doptimize=ReleaseFast -- comb quick radix shell std_block std_heap std_pdq tail tim twin

12th Gen Intel(R) Core(TM) i5-12400F

gantt
    title Sorting (ascending) 10000000 usize
    dateFormat x
    axisFormat %S s
    section random
    quick 1.670: 0,1670
    comb 3.156: 0,3155
    shell 5.469: 0,5467
    radix 0.304: 0,304
    tim 2.893: 0,2893
    tail 2.400: 0,2399
    twin 2.377: 0,2377
    std_block 3.371: 0,3372
    std_pdq 2.250: 0,2250
    std_heap 5.512: 0,5514
    section sorted
    quick 0.829: 0,829
    comb 1.179: 0,1179
    shell 0.740: 0,740
    radix 0.301: 0,301
    tim 0.025: 0,25
    tail 0.058: 0,58
    twin 0.071: 0,71
    std_block 0.266: 0,266
    std_pdq 0.041: 0,41
    std_heap 3.912: 0,3913
    section reverse
    quick 1.544: 0,1544
    comb 1.375: 0,1375
    shell 1.378: 0,1378
    radix 0.303: 0,303
    tim 0.822: 0,822
    tail 1.364: 0,1364
    twin 1.280: 0,1280
    std_block 1.304: 0,1304
    std_pdq 0.199: 0,199
    std_heap 3.844: 0,3845
    section ascending saw
    quick 2.979: 0,2978
    comb 2.088: 0,2089
    shell 1.807: 0,1807
    radix 0.322: 0,322
    tim 0.473: 0,473
    tail 0.486: 0,486
    twin 0.465: 0,465
    std_block 1.129: 0,1129
    std_pdq 1.604: 0,1604
    std_heap 4.246: 0,4249
    section descending saw
    comb 1.949: 0,1949
    shell 1.694: 0,1694
    radix 0.299: 0,299
    tim 1.339: 0,1339
    tail 1.478: 0,1478
    twin 1.288: 0,1288
    std_block 1.618: 0,1618
    std_pdq 1.613: 0,1613
    std_heap 4.262: 0,4261
gantt
    title Sorting (ascending) 10000000 isize
    dateFormat x
    axisFormat %S s
    section random
    quick 1.691: 0,1691
    comb 3.084: 0,3084
    shell 5.410: 0,5413
    radix 0.332: 0,332
    tim 2.951: 0,2953
    tail 2.414: 0,2414
    twin 2.414: 0,2414
    std_block 3.346: 0,3346
    std_pdq 2.309: 0,2309
    std_heap 5.449: 0,5447
    section sorted
    quick 0.798: 0,798
    comb 1.166: 0,1166
    shell 0.739: 0,739
    radix 0.247: 0,247
    tim 0.025: 0,25
    tail 0.059: 0,59
    twin 0.048: 0,48
    std_block 0.270: 0,270
    std_pdq 0.039: 0,39
    std_heap 3.816: 0,3815
    section reverse
    quick 1.581: 0,1581
    comb 1.347: 0,1347
    shell 1.234: 0,1234
    radix 0.262: 0,262
    tim 0.044: 0,44
    tail 1.396: 0,1396
    twin 0.041: 0,41
    std_block 0.953: 0,953
    std_pdq 0.204: 0,204
    std_heap 3.713: 0,3713
    section ascending saw
    quick 5.516: 0,5516
    comb 2.064: 0,2064
    shell 1.632: 0,1632
    radix 0.280: 0,280
    tim 0.449: 0,449
    tail 0.466: 0,466
    twin 0.478: 0,478
    std_block 1.157: 0,1157
    std_pdq 1.618: 0,1618
    std_heap 4.281: 0,4279
    section descending saw
    comb 2.039: 0,2040
    shell 1.644: 0,1644
    radix 0.279: 0,279
    tim 0.465: 0,465
    tail 1.492: 0,1492
    twin 0.481: 0,481
    std_block 1.596: 0,1596
    std_pdq 1.576: 0,1576
    std_heap 4.199: 0,4199

Big Thank to

voroskoi and other contributors