• Kuan-Wei Chiu's avatar
    lib/sort: optimize heapsort with double-pop variation · 0e02ca29
    Kuan-Wei Chiu authored
    Instead of popping only the maximum element from the heap during each
    iteration, we now pop the two largest elements at once.  Although this
    introduces an additional comparison to determine the second largest
    element, it enables a reduction in the height of the tree by one during
    the heapify operations starting from root's left/right child.  This
    reduction in tree height by one leads to a decrease of one comparison and
    one swap.
    
    This optimization results in saving approximately 0.5 * n swaps without
    increasing the number of comparisons.  Additionally, the heap size during
    heapify is now one less than the original size, offering a chance for
    further reduction in comparisons and swaps.
    
    The following experimental data is based on the array generated using
    get_random_u32().
    
    | N     | swaps (old) | swaps (new) | comparisons (old) | comparisons (new) |
    |-------|-------------|-------------|-------------------|-------------------|
    | 1000  | 9054        | 8569        | 10328             | 10320             |
    | 2000  | 20137       | 19182       | 22634             | 22587             |
    | 3000  | 32062       | 30623       | 35833             | 35752             |
    | 4000  | 44274       | 42282       | 49332             | 49306             |
    | 5000  | 57195       | 54676       | 63300             | 63294             |
    | 6000  | 70205       | 67202       | 77599             | 77557             |
    | 7000  | 83276       | 79831       | 92113             | 92032             |
    | 8000  | 96630       | 92678       | 106635            | 106617            |
    | 9000  | 110349      | 105883      | 121505            | 121404            |
    | 10000 | 124165      | 119202      | 136628            | 136617            |
    
    
    Link: https://lkml.kernel.org/r/20240113031352.2395118-3-visitorckw@gmail.comSigned-off-by: default avatarKuan-Wei Chiu <visitorckw@gmail.com>
    Cc: Ching-Chun (Jim) Huang <jserv@ccns.ncku.edu.tw>
    Cc: George Spelvin <lkml@sdf.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    0e02ca29
sort.c 9.25 KB