Standard sorting networks for small values of n

前端 未结 3 1287
感动是毒
感动是毒 2020-12-29 10:26

I\'m looking for a sorting network implementation of a 5-element sort, but since I couldn\'t find a good reference on SO, I\'d like to ask for sorting networks for all small

相关标签:
3条回答
  • 2020-12-29 10:40

    Too long for a comment. Prof Falken's answer above can be validated in MATLAB along the following lines: using a bit of find/replacing or regex-fu, write

    sn{3} = [...
        [[1,2],[1,3],[2,3]];...
        [[1,2],[2,3],[1,2]];...
        [[1,3],[1,2],[2,3]];...
        [[1,3],[2,3],[1,2]];...
        [[2,3],[1,2],[2,3]];...
        [[2,3],[1,3],[1,2]];
        ];
    

    and similarly for the other values of n, then run

    for n = 3:6
        test_in = cellfun(@str2num,num2cell(dec2bin(0:(2^n-1),n)));
        for j = 1:size(sn{n},1)
            test_out = test_in;
            for k = 1:2:size(sn{n},2)
                temp1 = test_out(:,sn{n}(j,k));
                temp2 = test_out(:,sn{n}(j,k+1));
                ind = temp2 < temp1;
                test_out(ind,sn{n}(j,k)) = temp2(ind);
                test_out(ind,sn{n}(j,k+1)) = temp1(ind);
            end
        end
        test = cellfun(@issorted,mat2cell(test_out,ones(1,2^n),n));
        assert(all(test),['n = ',num2str(n),' failed test']);   
    end
    

    The assertions hold for each value of n.

    0 讨论(0)
  • 2020-12-29 10:48

    Pick one from each section, presumably whichever runs fastest on your hardware since we're firmly in the realm of "fiendish optimization": http://smarterrecall.com/networks.html , reproduced below:

    I created this site to list all possible optimal sorting networks up to 6-inputs written using a program in matlab. The longest run-time is for 5-inputs at 45 seconds. If you are interested in contacting me, I can be reached at rpl1 [AT] rice [DOT] edu Cheers, Richard L.

    ----------
    
     - 2-input: 1 network
    
        [[1 2]]
    
    
    ----------
    
    
     - 3-input: 6 networks
    
    [[1 2][1 3][2 3]]
    [[1 2][2 3][1 2]]
    [[1 3][1 2][2 3]]
    [[1 3][2 3][1 2]]
    [[2 3][1 2][2 3]]
    [[2 3][1 3][1 2]]
    
    
    ----------
    
     - 4-input: 3 networks
    
    [[1 2][3 4][1 3][2 4][2 3]]
    [[1 3][2 4][1 2][3 4][2 3]]
    [[1 4][2 3][1 2][3 4][2 3]]
    
    
    ----------
    
     - 5-input: 180 networks
    
        [[1 2][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 2][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 2][3 4][1 3][4 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 2][3 4][1 3][4 5][2 5][3 4][1 3][2 4][2 3]]
        [[1 2][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 2][3 4][1 4][3 5][1 3][2 5][2 3][4 5][3 4]]
        [[1 2][3 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]]
        [[1 2][3 4][1 5][2 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 2][3 4][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 2][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 2][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]]
        [[1 2][3 4][2 4][3 5][1 3][2 5][2 3][4 5][3 4]]
        [[1 2][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 2][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 2][3 5][1 3][4 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 2][3 5][1 3][4 5][2 5][3 4][1 3][2 4][2 3]]
        [[1 2][3 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
        [[1 2][3 5][1 4][2 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 2][3 5][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 2][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 2][3 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]]
        [[1 2][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 2][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
        [[1 2][3 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]]
        [[1 2][4 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 2][4 5][1 3][2 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 2][4 5][1 3][2 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 2][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
        [[1 2][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]]
        [[1 2][4 5][1 4][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 2][4 5][1 4][3 5][2 5][3 4][1 3][2 4][2 3]]
        [[1 2][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]]
        [[1 2][4 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]]
        [[1 2][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
        [[1 2][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
        [[1 2][4 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]]
        [[1 3][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 3][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 4][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 3][2 4][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 3][2 4][1 4][2 5][1 2][3 5][2 3][4 5][3 4]]
        [[1 3][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]]
        [[1 3][2 4][1 5][3 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 3][2 4][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 3][2 4][2 5][3 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 3][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 3][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 5][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 3][2 5][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 3][2 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
        [[1 3][2 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 3][2 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
        [[1 3][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 3][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 3][2 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 3][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
        [[1 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]]
        [[1 3][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
        [[1 3][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]]
        [[1 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 3][4 5][1 4][2 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 3][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]]
        [[1 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
        [[1 3][4 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 3][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
        [[1 3][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
        [[1 4][2 3][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 4][2 3][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 4][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 4][2 3][1 3][2 5][1 2][4 5][2 4][3 5][3 4]]
        [[1 4][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 4][2 3][1 5][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 4][2 3][1 5][3 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 4][2 3][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 3][2 5][3 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 4][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 4][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 5][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 4][2 5][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 4][2 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 4][2 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 4][2 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
        [[1 4][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][2 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 4][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 4][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
        [[1 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
        [[1 4][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 4][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 4][3 5][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
        [[1 4][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 4][3 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 4][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 4][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
        [[1 5][2 3][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 5][2 3][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
        [[1 5][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 5][2 3][1 3][2 4][1 2][4 5][2 4][3 5][3 4]]
        [[1 5][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 5][2 3][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][2 3][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][2 3][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 3][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 4][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[1 5][2 4][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 5][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][2 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][2 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[1 5][2 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
        [[1 5][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][2 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 5][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
        [[1 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
        [[1 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
        [[1 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[1 5][3 4][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
        [[1 5][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
        [[1 5][3 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[1 5][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
        [[1 5][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]]
        [[2 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[2 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]]
        [[2 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]]
        [[2 3][4 5][1 3][2 4][1 2][4 5][2 4][3 5][3 4]]
        [[2 3][4 5][1 3][2 4][1 4][3 5][1 2][3 4][2 3]]
        [[2 3][4 5][1 3][2 5][1 4][3 5][1 2][3 4][2 3]]
        [[2 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[2 3][4 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
        [[2 3][4 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
        [[2 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
        [[2 3][4 5][1 5][2 4][1 4][3 5][1 2][3 4][2 3]]
        [[2 3][4 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]]
        [[2 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
        [[2 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
        [[2 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
        [[2 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
        [[2 4][3 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[2 4][3 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[2 4][3 5][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
        [[2 4][3 5][1 4][2 3][1 3][4 5][1 2][3 4][2 3]]
        [[2 4][3 5][1 4][2 5][1 3][4 5][1 2][3 4][2 3]]
        [[2 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
        [[2 4][3 5][1 5][2 3][1 3][4 5][1 2][3 4][2 3]]
        [[2 4][3 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]]
        [[2 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
        [[2 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
        [[2 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
        [[2 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
        [[2 5][3 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
        [[2 5][3 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
        [[2 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
        [[2 5][3 4][1 4][2 3][1 3][4 5][1 2][3 4][2 3]]
        [[2 5][3 4][1 4][3 5][1 2][4 5][1 3][2 4][2 3]]
        [[2 5][3 4][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
        [[2 5][3 4][1 5][2 3][1 3][4 5][1 2][3 4][2 3]]
        [[2 5][3 4][1 5][2 4][1 3][4 5][1 2][3 4][2 3]]
    
    
    ----------
    
    
     - 6-input: 90 networks
    
        [[1 2][3 4][5 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 2][3 4][5 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 2][3 4][5 6][1 4][2 6][3 5][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 2][3 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 2][3 4][5 6][1 5][2 4][3 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 2][3 4][5 6][1 6][2 4][3 5][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 2][3 5][4 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 2][3 5][4 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 2][3 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 2][3 5][4 6][1 4][2 5][3 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 2][3 5][4 6][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 2][3 5][4 6][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 2][3 6][4 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 2][3 6][4 5][1 3][2 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 2][3 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 2][3 6][4 5][1 4][2 6][3 5][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 2][3 6][4 5][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 2][3 6][4 5][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 4][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 4][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 3][2 4][5 6][1 4][2 5][3 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 3][2 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 3][2 4][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 3][2 4][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 3][2 5][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 3][2 5][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 3][2 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 3][2 5][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 5][4 6][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 5][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 6][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 3][2 6][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 3][2 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 3][2 6][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 6][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 3][2 6][4 5][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 3][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 3][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 4][2 3][5 6][1 3][2 5][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 4][2 3][5 6][1 5][2 4][3 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 3][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 3][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 5][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 5][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 5][3 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 5][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 5][3 6][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 5][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 6][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 6][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 6][3 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 4][2 6][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 6][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 4][2 6][3 5][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 3][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 5][2 3][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 5][2 3][4 6][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 5][2 3][4 6][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 3][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 3][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 4][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 5][2 4][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 4][3 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 4][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 4][3 6][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 5][2 4][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 6][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 6][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 6][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 5][2 6][3 4][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 5][2 6][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 5][2 6][3 4][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 3][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 6][2 3][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
        [[1 6][2 3][4 5][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
        [[1 6][2 3][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 3][4 5][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 3][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 4][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
        [[1 6][2 4][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 4][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 4][3 5][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 4][3 5][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 6][2 4][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 5][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 5][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 5][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 6][2 5][3 4][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
        [[1 6][2 5][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
        [[1 6][2 5][3 4][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    

    Personally I'd check that the sorting network is correct before using it, rather than taking the word of some random page on the internet. Brute force "only" requires running it against finitely many inputs: "obviously" n! inputs is enough, and in fact so is 2**n (https://en.wikipedia.org/wiki/Sorting_network#Zero-one_principle).

    All of the optimal 5-networks involve "3" in the last swap, so picking the median in fewer swaps isn't quite so easy as all that. It can be done in 6 comparisons, though. There's way more code than you need here, if you can ignore the whining about the question:

    Code to calculate "median of five" in C#

    To pick a median you don't necessarily do any swaps, other than perhaps one unconditional swap if you want to preserve all 5 values. A move might be adequate.

    0 讨论(0)
  • 2020-12-29 10:56

    The asker was specifically interested in a median-of-5 implementation based on sorting networks, so I will address this specific case. A brief review of the literature indicates what optimal solutions look like according to various metrics.

    Michael Codish, Luís Cruz-Filipe, Thorsten Ehlers, Mike Müller, and Peter Schneider-Kamp. "Sorting networks: to the end and back again." Journal of Computer and System Sciences (2016) in table 1 shows that for n=5, the minimal number of compare-swaps is 9, and the minimal depth of the network is 5. As each compare-swap is equivalent to two min/max operations, the minimal number of min/max operations required is 18.

    Lukáŝ Sekanina, "Evolutionary Design Space Exploration for Median Circuits". In: EvoWorkshops, March 2004, pp. 240-249, gives the minimal number of min / max operations required for an optimal five-input median-selection network as 10 in table 1.

    William Gasarch, Wayne Kelly, and William Pugh. "Finding the i th largest of n for small i, n." ACM SIGACT News 27, no. 2 (1996): 88-96, table 1: at least 6 comparisons are needed for median-of-5.

    In general, sorting networks with the minimal number of operations do not reduce to median-selection networks with the minimal number of operations simply by the elimination of redundant operations. But it is possible to find networks that do reduce in optimal fashion for at least some values of n. For n=5, a brute-force search for such networks is feasible.

    The code below shows for four variants of five-input sorting networks comprising nine compare-swap operations or, alternatively, 18 min / max operations. When compiled with FULL_SORT = 0 these turn into median-selection networks with 10 min/max operations. So according to this metric, both sorting and median selection are optimal.

    However, when used as a sorting network, all four variants have a depth of six instead of the minimum of five. Also, when configured as a median-selection network based on comparisons instead of min / max operations, all require seven rather than the minimum of six comparisons.

    Example compilation results from Compiler Explorer (godbolt): Using 18 min / max operations for five-input sort, using 10 min / max operations for five-input median.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define VARIANT       1
    #define USE_MIN_MAX   1
    #define FULL_SORT     0
    
    typedef float T;
    
    #if USE_MIN_MAX
    #define MIN(a,b) ((T)(fmin(a,b)))
    #define MAX(a,b) ((T)(fmax(a,b)))
    #define SWAP(i,j) do { T s = MIN(a##i,a##j); T t = MAX(a##i,a##j); a##i = s; a##j = t; } while (0)
    #else // USE_MIN_MAX
    #define MIN(a,b) (((a) > (b)) ? (b) : (a))
    #define MAX(a,b) (((a) > (b)) ? (a) : (b))
    #define SWAP(i,j) do { if (a##i > a##j) { T temp = a##i; a##i = a##j; a##j = temp; }} while (0)
    #endif // USE_MIN_MAX
    
    /* Use sorting/median network to fully or partially sort array of five values
       and return the median value
    */
    T network5 (T *a)
    {
        // copy to scalars
        T a0, a1, a2, a3, a4;
        a0=a[0];a1=a[1];a2=a[2];a3=a[3];a4=a[4];
    
    #if VARIANT == 1
       SWAP (0, 1);  SWAP (2, 3);
       SWAP (0, 2);  SWAP (1, 3);
       SWAP (2, 1);
       SWAP (1, 4);
       SWAP (1, 2);
       SWAP (0, 1);  SWAP (3, 4);
    #elif VARIANT == 2
        SWAP (3, 4);  SWAP (0, 2);
        SWAP (2, 4);  SWAP (0, 3);
        SWAP (2, 3);
        SWAP (1, 2);
        SWAP (0, 1);  SWAP (2, 3);
        SWAP (3, 4);
    #elif VARIANT == 3
        SWAP (3, 2);  SWAP (0, 4);
        SWAP (2, 4);  SWAP (0, 3);
        SWAP (2, 3);
        SWAP (1, 2);
        SWAP (0, 1);  SWAP (2, 3);
        SWAP (3, 4);
    #elif VARIANT == 4 
        SWAP (2, 4);  SWAP (0, 1);
        SWAP (0, 2);  SWAP (1, 4);
        SWAP (2, 3);
        SWAP (1, 2);
        SWAP (2, 3);  SWAP (0, 1);
        SWAP (3, 4);
    #else
    #error unsupported VARIANT
    #endif
    
    #if FULL_SORT
        // copy back sorted results
        a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;
    #endif
        // return median-of-5
        return a2;
    }
    
    0 讨论(0)
提交回复
热议问题