сравнивая числа для сортировки, затем получить среднее значение - PullRequest
4 голосов
/ 18 ноября 2011

Сортировка пяти целых чисел с использованием побитовых операторов или операторов сравнения может быть достигнута, сначала получив наибольшее число, затем второе наибольшее, затем третье и т. Д.

Вот мой код для получения наибольшего числа:

#include <stdio.h>

int main() {
    int a, b, c, d, e;
    int aa, bb, cc, dd, ee;

    a = 4; b = 2; c = 5; d = 1; e = 3;

    aa = (a > b) ?
         ((a > c) ? ((a > d) ? ((a > e) ? a : e) : ((d > e) ? d : e)) :
                    ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e))) :
         ((b > c) ? ((b > d) ? ((b > e) ? b : e) : ((d > e) ? d : e)) :
                    ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e)));


    printf("highest: %d\n", aa);
    return 0;
}

Я думаю, что с помощью этого метода можно получить второе, третье, четвертое и пятое старшие числа.

Есть ли другой способ получить медиану из пяти целых чисел, используя операторы сравнения / побитовые операции?любой другой комбинаторный метод может быть допустимым.

Кстати, я собираюсь реализовать этот алгоритм аппаратно.

Использование комбинаторного метода в сортировке будет быстрым, а не конечным автоматом.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Один из способов обдумать это - рассмотреть 10 операций сравнения между 5 числами как ваши двоичные входы.Тогда у вас есть варианты:

  1. Нарисуйте карту Карно с 10 входами и упростите логику, где это возможно.
  2. Постройте 10-битное число как индекс в таблице.

Некоторые возможности никогда не появятся, поэтому я уверен, что возможны некоторые упрощения.Например, если (a> b) и (b> c), то (a> c) всегда будет истинным.Который поможет с подходом № 1 и генерирует ошибку в подходе № 2.

1 голос
/ 18 ноября 2011

Третье наибольшее число из пяти целых чисел равно медиане, поэтому если вы получите третье по величине число, у вас все в порядке.

0 голосов
/ 08 декабря 2011

ОБНОВЛЕНИЕ

Я произвел комбинаторную сортировку в verilog с использованием сортировочных сетей.

module comparator(
    input [31:0] a_1,
    input [31:0] b_1,
    output reg [31:0] a_0,
    output reg [31:0] b_0
);

    always @(a_1, b_1) begin
        if (a_1 > b_1) begin
            a_0 = a_1;
            b_0 = b_1;
        end
        else begin
            a_0 = b_1;
            b_0 = a_1;
        end
    end
endmodule

module sorting_test;
    reg [31:0] a, b, c, d, e;
    wire [31:0] aa, bb, cc, dd, ee;
    reg clk;

    initial begin
        $dumpfile("sorting.vcd");
        $dumpvars();
        #10 $finish;
    end

    initial begin
        clk = 0;
    end

    always #1 clk = ~clk;

    initial begin
        a = 0;
        b = 0;
        c = 0;
        d = 0;
        e = 0;


        #1
        a = 4;
        b = 1;
        c = 2;
        d = 5;
        e = 3;
        #1
        a = 1;
        b = 16;
        c = 12;
        d = 14;
        e = 15;

        #1
        a = 1;
        b = 4;
        c = 9;
        d = 19;
        e = 2;

        #1
        a = 16;
        b = 11;
        c = 12;
        d = 16;
        e = 12;

        #1  
        a = 16;
        b = 17;
        c = 11;
        d = 15;
        e = 3;

        #1  
        a = 13;
        b = 9;
        c = 2;
        d = 1;
        e = 18;

        #1  
        a = 17;
        b = 3;
        c = 8;
        d = 3;
        e = 14;

        #1  
        a = 14;
        b = 10;
        c = 9;
        d = 14;
        e = 14;

        #1  
        a = 15;
        b = 12;
        c = 13;
        d = 10;
        e = 19;

        #1  
        a = 6;
        b = 8;
        c = 7;
        d = 16;
        e = 15;

        #1  
        a = 10;
        b = 17;
        c = 18;
        d = 1;
        e = 16;
    end

    wire [31:0] a1, b1, c1, d1, b2, c2, d2, e2, a2, b3, c3, d3, b4, c4, d4, e4, a5, b5, c5, d5;
    comparator c1l1( a,  b, a1, b1);
    comparator c2l1( c,  d, c1, d1);
    comparator c1l2(b1, c1, b2, c2);
    comparator c2l2(d1,  e, d2, e2);
    comparator c1l3(a1, b2, a2, b3);
    comparator c2l3(c2, d2, c3, d3);
    comparator c1l4(b3, c3, b4, c4);
    comparator c2l4(d3, e2, d4, e4);
    comparator c1l5(a2, b4, a5, b5);
    comparator c2l6(c4, d4, c5, d5);

    assign aa = a5;
    assign bb = b5;
    assign cc = c5;
    assign dd = d5;
    assign ee = e4;

endmodule

@ Спасибо Стиву Джессопу за предоставление информации.

@David Winant и@sth для предоставления идей.=)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...